如何用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
相关产品推荐
相关产品推荐

