1

我有 2 个清单之一:

[(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)]

4

1 回答 1

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可能您想要的。

由于我不确切知道您将其用于什么,我将建议另一种解决方案,该解决方案返回一个列表,其中包含两个列表中出现的项目,它们在任一列表中出现的最少次数(无序)。这与上面的设置解决方案不同,后者只返回每个项目在另一个项目中出现的次数,而不关心它在第一个项目中出现的次数。这Counter用于多重集的交集。

>>> 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)]
于 2013-04-23T07:35:45.537 回答