如何统计两个列表的公共元素数量(含双方均存在的重复项)
统计列表公共元素(重复项按规则计数)
需求说明
统计两个列表的公共元素总数量,重复项遵循以下规则:
- 若元素在一个列表出现1次、另一个列表出现2次,计1次
- 若元素在两个列表均出现2次,计2次
- 最终总数是所有元素按上述规则计算后的累加值
示例
示例1:
x = [1, 2, 3, 4, 5, 5] y = [1, 2, 5, 6, 7, 8]
公共元素数量为3(1、2各计1次,5计1次,总和1+1+1=3)
示例2:
x = [1, 2, 3, 4, 5, 5] y = [1, 2, 5, 6, 7, 8, 5]
公共元素数量为4(1、2各计1次,5计2次,总和1+1+2=4)
问题
找到的代码 res = sum(i == j for i, j in zip(x, y)) 不符合需求,该代码仅按位置匹配相等元素计数,无法正确统计重复元素的出现次数。
解决方案
利用collections.Counter统计元素出现次数,对每个公共元素取两个列表中出现次数的最小值,累加得到结果:
from collections import Counter def count_common_elements(x, y): cnt_x = Counter(x) cnt_y = Counter(y) # 遍历两个Counter的公共元素,取最小出现次数求和 return sum(min(cnt_x[elem], cnt_y[elem]) for elem in cnt_x & cnt_y) # 测试示例1 x1 = [1, 2, 3, 4, 5, 5] y1 = [1, 2, 5, 6, 7, 8] print(count_common_elements(x1, y1)) # 输出3 # 测试示例2 x2 = [1, 2, 3, 4, 5, 5] y2 = [1, 2, 5, 6, 7, 8, 5] print(count_common_elements(x2, y2)) # 输出4
说明
Counter会自动统计列表中每个元素的出现次数cnt_x & cnt_y能直接获取两个Counter的公共元素(即同时存在于两个列表的元素)- 对每个公共元素,取两个列表中出现次数的最小值,累加后就是符合规则的总数量
内容的提问来源于stack exchange,提问作者roisinncc
相关产品推荐
相关产品推荐

