比较两个列表中的列表以查找 python 中的匹配项
Comparing lists within two lists for a match in python
我有两个列表。每个列表都包含一个包含两个点值列表的列表,以及一个与这些点相关联的浮点值。
例如。
列出一个 [index 0]:
[[dt.Point([43.61, 24.88, -37.41]), dt.Point([42.33, 21.59, -31.28])], 10.0]
等等
列表二:相同的格式。
我正在尝试比较两个列表之间的点值以获得完全匹配
(意思是 list1[0][0] == list2[0][0]
)
- 感谢您的帮助
>>> 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
中的整数值替换为"Points"。显然,这是假设可以直接比较 dt.Point
个对象。
对于这种情况,您可能需要使用自定义散列方法制作一个简单的 class,这样您就可以发现相同的值。这样您就不必陷入将所有值相互比较的麻烦事中。一旦您可以散列两点和一个值的唯一组合,您只需制作两组列表并将它们相交。
一个基本示例看起来像这样(使用 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 的内置元组散列,既好又快。
我有两个列表。每个列表都包含一个包含两个点值列表的列表,以及一个与这些点相关联的浮点值。
例如。
列出一个 [index 0]: [[dt.Point([43.61, 24.88, -37.41]), dt.Point([42.33, 21.59, -31.28])], 10.0]
等等
列表二:相同的格式。
我正在尝试比较两个列表之间的点值以获得完全匹配
(意思是 list1[0][0] == list2[0][0]
)
- 感谢您的帮助
>>> 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
中的整数值替换为"Points"。显然,这是假设可以直接比较 dt.Point
个对象。
对于这种情况,您可能需要使用自定义散列方法制作一个简单的 class,这样您就可以发现相同的值。这样您就不必陷入将所有值相互比较的麻烦事中。一旦您可以散列两点和一个值的唯一组合,您只需制作两组列表并将它们相交。
一个基本示例看起来像这样(使用 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 的内置元组散列,既好又快。