我有两个列表一个:
[(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)]
答案 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)]
这会返回B
中A
中的每个项目,如果它出现在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