检查列表是否包含另一个列表的所有项

27
什么是检查一个元组列表中是否包含另一个列表的所有元组的最简单/最快方法?例如:
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)

但是这似乎总是返回true。有更好的方法吗?


2
研究并使用集合。 - acushner
3个回答

48
你可以使用 set
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

8
为了简单起见,你可以这样做:
print all(x in t1 for x in t2)

然而,这将会在t2的每个元素中搜索t1。当t1很小的时候,这可能并不重要,但为了允许更大的集合,我建议这样做:

s1 = set(t1)
print all(x in s1 for x in t2)

或者这样:
print set(t1).issuperset(t2)

这样做通常会更快,因为对于集合而言,in 操作比对于大型列表更快。无论大小如何,将 t2 转换为集合都不会带来主要的性能优势,所以我不建议这么做。

一如既往地,在开始时就将数据存储在“正确”的集合中会更好。因此,如果主要目的是在 t1 中查找内容,则应使用集合而非列表。


4
你可以从这些列表中创建一个 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接