检查元组列表是否包含另一个列表所具有的所有元组的最简单/最快方法是什么。例如:
t1 = [ (1,2), (3,4), (5,6), (7,8), (9,10), (11,12) ]
t2 = [ (3,4), (11,12) ]
将是一个真实的情况,因为t1包含t2中的所有元组。我试过像:
[i for e in t2 for i in t1 if e in i]
sorted(t1) == sorted(t2)
但这似乎总是回归真实。还有更好的方法吗?
答案 0 :(得分:16)
您可以使用set
s
t1 = [ (1,2), (3,4), (5,6), (7,8), (9,10), (11,12) ]
t2 = [ (3,4), (11,12) ]
set(t2).issubset(t1)
# returns true
# or equivalent use '<=' so
set(t2) <= set(t1)
# returns true
答案 1 :(得分:5)
为简单起见,您可以这样做:
print all(x in t1 for x in t2)
然而,这将在t1
中搜索t2
中的每个元素。如果t1
在这种情况下很小,那可能无关紧要,但为了允许更大的集合,我会这样做:
s1 = set(t1)
print all(x in s1 for x in t2)
或者这个:
print set(t1).issuperset(t2)
这通常会更快,因为in
对于集合比对大型列表要快得多。将t2
转换为集合没有主要的性能优势,无论大小如何,所以我不会。
与往常一样,如果您在“正确”的集合中开始使用数据,那就更好了。因此,如果t1
的主要目的是在其中查找内容,请首先使用set
而不是列表。
答案 2 :(得分:2)
您可以从这些列表中创建set
并使用issubset
方法:
>>> t1 = [ (1,2), (3,4), (5,6), (7,8), (9,10), (11,12) ]
>>> t2 = [ (3,4), (11,12) ]
>>> s1 = set(t1)
>>> s2 = set(t2)
>>> s2.issubset(s1)
True