Python:在另一个列表中查找一个列表的元素计数

16

假设我有两个列表list1list2,如下:

list1 = [ 3, 4, 7 ]
list2 = [ 5, 2, 3, 5, 3, 4, 4, 9 ]

我想要找到list1中与list2中相同的元素数量。

期望输出为4,因为list1中的3和4在list2中各出现了两次。因此,总数为4。

4个回答

29

使用列表推导式并检查元素是否存在

c =  len([i for i in list2 if i in list1 ])

更好的一个来自@Jon,即

c = sum(el in list1 for el in list2)

输出:4


7
为什么要在这里建立一个列表......虽然由于列表的存在,检查不是很有效,但你可以将其写成sum(el in list1 for el in list2) - Jon Clements
嗨,如果我想知道列表中每个元素的计数,结果将是:[2, 2, 0]。 - Anis Boudieb

4
您可以使用sum(...)结合生成器表达式来实现此操作,示例代码如下:
>>> list1 = [ 3, 4, 7 ]
>>> list2 = [ 5, 2, 3, 5, 3, 4, 4, 9 ]

#         v returns `True`/`False` and Python considers Boolean value as `0`/`1`
>>> sum(x in list1 for x in list2)
4 

作为一种替代方法,您也可以使用Python的__contains__魔法函数来检查列表中是否存在元素,并使用filter(..)来过滤掉不符合"in"条件的元素。例如:
>>> len(list(filter(list1.__contains__, list2)))
4

# Here "filter(list(list1.__contains__, list2))" will return the 
# list as: [3, 3, 4, 4]

想要了解__contains__的更多细节,请参考:What does __contains__ do, what can call __contains__ function?


不要介意使用dunder方法不是一个好的实践 - 这只适用于Python 2。 - Jon Clements

2
你可以使用 count 方法遍历 first 列表并将给定数字的 出现次数 添加到 sum 中。
for number in list1: 
   s += list2.count(number);

1

您可以在这里使用collections.Counter,因此首先是一个天真而相当丑陋的实现(我的)。

list1 = [ 3, 4, 7 ]
list2 = [ 5, 2, 3, 5, 3, 4, 4, 9 ]
from collections import Counter
total = 0 
c = Counter(list2)
for i in list1: 
  if c[i]: 
    total += c[i]

这个版本没有考虑第一个列表中是否有重复项(HT Jon),更加优雅的版本应该是:
counter = Counter(list2)
occurrences = sum(counter[v] for v in set(list1))

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