比较两个列表中的列表,以便在python中进行匹配

时间:2018-05-22 00:10:11

标签: python python-2.7 maya

我有两个清单。每个列表都包含一个列表,其中包含两个点值的列表以及与这些点关联的浮点值。

离。 列出一个索引0:[[dt.Point([43.61, 24.88, -37.41]), dt.Point([42.33, 21.59, -31.28])], 10.0]等在最多8k索引范围内重复。 列表二:格式相同。

我正在尝试比较两个列表之间的点值以获得完全匹配(意味着list1[0][0] == list2[0][0]),但到目前为止,我的解决方案已经过于复杂且缓慢。我还没有能够以有效的方式解决这个问题。或者嵌套像这样的列表只是导致我的问题? - 感谢任何帮助

2 个答案:

答案 0 :(得分:3)

对于这种事情,您可能希望使用自定义哈希方法创建一个简单的类,以便您可以发现相同的值。这样你就不必进入将所有价值相互比较的混乱业务。一旦你可以散列两个点和一个值的唯一组合,你就可以制作两组你的列表并将它们相交。

一个基本的例子看起来像这样(用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__可能是也可能不是所需的行为。

实际的散列是在JSONConvert方法中完成的,它可以窃取python内置的元组散列,这样很好很快。

相关:http://discourse.techart.online/t/geometry-hash/3144

答案 1 :(得分:1)

>>> 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]

l1l2中的整数值替换为" Points"在上面的例子中。显然,这假设可以直接比较dt.Point个对象。

相关问题