Сравнение списков в двух списках на совпадение в python - PullRequest
0 голосов
/ 22 мая 2018

У меня есть два списка.Каждый список содержит список, содержащий список из двух значений точек и значение с плавающей запятой, связанное с этими точками.

отл.список один индекс 0: [[dt.Point([43.61, 24.88, -37.41]), dt.Point([42.33, 21.59, -31.28])], 10.0] и т. д. повторяется в диапазоне до 8 тыс. индексов.Список два: тот же формат.

Я пытаюсь сравнить значения точек между двумя списками для точного соответствия (то есть list1[0][0] == list2[0][0]), но мои решения до сих пор были запутанными и медленными.Я не смог понять, как сделать это эффективным способом.Или вложение таких списков просто вызывает у меня проблемы?Спасибо за любую помощь

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Для такого рода вещей вы, возможно, захотите создать простой класс с пользовательским хеш-методом, чтобы вы могли определить идентичные значения.Таким образом, вам не нужно вдаваться в грязный бизнес, сравнивая все ценности друг с другом.Как только вы можете хешировать уникальную комбинацию из двух точек и значения, вы просто создаете два набора своих списков и пересекаете их.

Базовый пример будет выглядеть примерно так (с openMaya MVectors вместо точек pymel -но идея та же самая)

from maya.api.OpenMaya import MVector

class PointHash(object):

    def __init__(self, p1, p2, v):
        self.p1 = p1
        self.p2 = p2
        self.value = v
        self._hashvalue = hash((p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, v))

    def __hash__(self):
        return self._hashvalue

    def __eq__(self, other):
        return hash(self) == hash(other)

    def __repr__(self):
        return "PointHash %i" % self.__hash__()


#sample data
a = MVector(1.1, 2.2, 3.3)
b = MVector(1.0009, 2.00019, 3.0001)
c = MVector(21.0, 22.0, 23.0)


# some lists
set_one = set((PointHash(a, b, 1.0), PointHash(b, a, 1.0), PointHash(a, b, 2.0), PointHash(b, c, 1.0)))
set_two = set((PointHash(a, b, 1.0), PointHash(b, a, 1.1), PointHash(a, b, -1.0), PointHash(b, c, 1.0)))

print "common:"
for item in set_one.intersection(set_two):
    print item.p1, item.p2, item.value


#> (1.1, 2.2, 3.3) (1.0009, 2.00019, 3.0001) 1.0
#> (1.0009, 2.00019, 3.0001) (21, 22, 23) 1.0

Как написано, это потребует совпадения EXACT для получения тех же значений, вы можете обнаружить, что хотите квантовать фактические значения вершин или что угодно, чтобынемного более грубое разрешение, чтобы ловить промахи тоже.Как написано, он также предполагает, что PointHash(a,b, 1.0) - это не то же самое, что PointHash(b,a,1.0), что может или не может быть желаемым поведением.

Фактическое хеширование выполняется методом __init__, и он крадет встроенное хеширование кортежей Python, что приятно и быстро.

Связано: http://discourse.techart.online/t/geometry-hash/3144

0 голосов
/ 22 мая 2018
>>> l1 = [[[1,2], 10.], [[3, 4], 5.0]]
>>> l2 = [[[1,2], 8.], [[3, 6], 5.0]]

>>> [(v1[0] == v2[0] and v1[1] == v2[1]) for (v1,_), (v2,_) in zip(l1, l2)]
[True, False]

Замените целочисленные значения в l1, l2 на "Точки" в вышеприведенном примере.Очевидно, это предполагает, что dt.Point объекты могут сравниваться напрямую.

...