检查两个列表中是否有相同的值

时间:2013-04-23 07:34:03

标签: python list

我有两个列表一个:

[(12,23),(12,45),(12,23),(2,5),(1,2),(2,4),(7,34)]最多可达1000个元素 另一个:

[(12,23),(12,45),(12,23),(2,5),(1,2),(2,66),(34,7)]最多可达241个元素。

我想要的是检查列表是否包含任何相同的元素,然后将它们放入新的列表中。

所以新列表变为

[(12,23),(12,45),(12,23),(2,5),(1,2)]

2 个答案:

答案 0 :(得分:13)

这不包括重复

>>> A = [(12,23),(12,45),(12,23),(2,5),(1,2),(2,4),(7,34)]
>>> B = [(12,23),(12,45),(12,23),(2,5),(1,2),(2,66),(34,7)]
>>> set(B).intersection(A) # note: making the smaller list to a set is faster
set([(12, 45), (1, 2), (12, 23), (2, 5)])

或者

>>> A = [(12,23),(12,45),(12,23),(2,5),(1,2),(2,4),(7,34)]
>>> B = [(12,23),(12,45),(12,23),(2,5),(1,2),(2,66),(34,7)]
>>> filter(set(B).__contains__, A)
[(12, 23), (12, 45), (12, 23), (2, 5), (1, 2)]

这会返回BA中的每个项目,如果它出现在set中,这会产生您在示例中给出的结果,但是>>> from collections import Counter >>> A = [(12,23),(12,45),(12,23),(2,5),(1,2),(2,4),(7,34)] >>> B = [(12,23),(12,45),(12,23),(2,5),(1,2),(2,66),(34,7)] >>> list((Counter(A) & Counter(B)).elements()) [(1, 2), (12, 45), (12, 23), (12, 23), (2, 5)] 可能是什么你想要的。

由于我不确切知道您使用的是什么,我建议再提一个返回列表的解决方案,其中包含两个列表中出现的项目,最小次数它们出现在任一列表中(无序)。这与上面的设定解决方案不同,后者只返回每个项目在其他中出现的次数,而不关心它在第一次出现的次数。这使用Counter作为多集合的交集。

{{1}}

答案 1 :(得分:0)

list1 = [(12,23), (12,45), (12,23), (2,5), (1,2), (2,4), (7,34)]
list2 = [(12,23), (12,45), (12,23), (2,5), (1,2), (2,66), (34,7)]

similar = []
for tup in list1:
    if tup in list2:
        similar.append(tup)

print similar