【问题标题】:checking to see if same value in two lists [duplicate]检查两个列表中的值是否相同[重复]
【发布时间】:2013-04-16 07:48:12
【问题描述】:

我有 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)]

【问题讨论】:

  • 只要新列表包含所有相同的元素,oder 没关系
  • @JohnSmith 另外,只要说一个值在第一个列表中出现 3 次,在最后一个列表中出现 2 次,它会在新列表中出现多少次?还是没关系
  • @tostao 我认为这是要求与该问题不同的列表交集
  • 检查这个问题:stackoverflow.com/q/642763/422353

标签: python list


【解决方案1】:

这不包括重复项

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

由于我不确切知道您使用它的目的,我会建议另一种解决方案,它返回一个列表,包含两个列表中出现的项目,最少次它们出现在任一列表中(无序)。这与上面的设置解决方案不同,后者仅返回每个项目在 other 中出现的次数,而不关心它在第一次出现的次数。这将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)]

【讨论】:

  • 鉴于B明显小于A,建议大家在语句中互相交换。此外,过滤方法比设置的交点要快得多。
  • @poke 好主意,我已经更改了,我也会添加注释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 2020-03-30
  • 1970-01-01
相关资源
最近更新 更多