如何迭代对比任意数量列表并返回所有列表的公共元素集合
多列表公共元素查找实现方案
对比两个列表取公共元素的操作确实很简单,直接用set(a) & set(b)就能搞定。如果要适配任意n个列表的公共元素查找需求,可以直接利用Python集合内置的intersection()方法实现,这个方法原生支持传入多个可迭代对象计算交集,不用自己写循环逐个判断。
基础通用实现
这个版本支持传入任意数量的列表,返回去重后的公共元素:
def find_common(*lists): # 处理无输入的边界情况 if not lists: return [] # 第一个列表转集合后,直接和剩余所有列表求交集 return list(set(lists[0]).intersection(*lists[1:]))
使用示例
list1 = [1, 3, 5, 7, 9] list2 = [2, 3, 5, 8, 9] list3 = [3, 4, 5, 9, 10] print(find_common(list1, list2, list3)) # 输出结果:[3, 5, 9] (顺序不固定,因为集合是无序的)
进阶:保留元素顺序的实现
如果需要公共元素的顺序和第一个输入列表的出现顺序保持一致,可以用下面的版本:
def find_common_preserve_order(*lists): if not lists: return [] common_set = set(lists[0]).intersection(*lists[1:]) seen = set() res = [] for item in lists[0]: if item in common_set and item not in seen: res.append(item) seen.add(item) return res
注意事项
- 上述实现返回的都是去重后的结果,如果需要保留元素的重复出现次数(比如要求每个列表中都至少出现2次的元素),可以改用
collections.Counter统计每个列表的元素频率后再取交集 - 如果输入的任意一个列表为空,返回的结果会是空列表,符合交集的运算逻辑
- 无需提前指定n的数值,函数支持传入任意数量的列表参数
内容的提问来源于stack exchange,提问作者Daftendirekt
相关产品推荐
相关产品推荐

