You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python找出列表列表中出现一次及多次的公共元素?

Pythonic方法提取在多个子列表中重复出现的元素

给定列表:

list_of_list=[[1,2,3,4,133,90],[4,11,22,99,3],[5,3,22,66,12,10],[1,99,101]]

需求是找出在至少两个子列表中出现的元素,预期输出:[1,3,4,22,99]

你之前尝试的set.union方法只能获取所有子列表的元素并集,无法满足需求,下面是几种Pythonic的解决思路:

方法一:使用collections.Counter统计跨子列表出现次数

这是最直观且易读的方式,核心是统计每个元素在多少个不同子列表中出现:

from collections import Counter

list_of_list = [[1,2,3,4,133,90],[4,11,22,99,3],[5,3,22,66,12,10],[1,99,101]]

# 遍历每个子列表,先转集合避免同一子列表内重复元素干扰计数
element_counter = Counter()
for sublist in list_of_list:
    element_counter.update(set(sublist))

# 筛选出出现次数≥2的元素,排序后匹配预期输出
result = sorted([elem for elem, count in element_counter.items() if count >= 2])
print(result)  # 输出: [1, 3, 4, 22, 99]

关键细节:

  • 用set(sublist)转换子列表:确保同一子列表内的重复元素不会被重复统计(比如子列表[1,1,2]只会让1的计数+1)
  • Counter.update()会自动累加每个元素的出现次数
  • 最后排序是为了和你的预期输出顺序一致,若不需要特定顺序可省略sorted()

方法二:生成器表达式简化写法

如果喜欢更简洁的一行式,可以用生成器表达式直接构建Counter:

from collections import Counter

list_of_list = [[1,2,3,4,133,90],[4,11,22,99,3],[5,3,22,66,12,10],[1,99,101]]
result = sorted(elem for elem, cnt in Counter(x for sub in list_of_list for x in set(sub)).items() if cnt >= 2)
print(result)

方法三:手动统计(不依赖Counter)

如果不想引入额外模块,可以用普通字典手动统计:

list_of_list = [[1,2,3,4,133,90],[4,11,22,99,3],[5,3,22,66,12,10],[1,99,101]]

count_dict = {}
for sublist in list_of_list:
    # 遍历去重后的子列表元素
    for elem in set(sublist):
        count_dict[elem] = count_dict.get(elem, 0) + 1

result = sorted([elem for elem, count in count_dict.items() if count >= 2])
print(result)

这些方法都能准确筛选出在至少两个子列表中出现的元素,符合你的需求。

内容的提问来源于stack exchange,提问作者neo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:10:29