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

Python中求任意数量列表交集的最Pythonic实现方法

获取任意数量列表的共同元素的最Pythonic方法

示例输入

x = [
        [5, 1, 2, 3, 4],
        [5, 6, 7, 8, 9],
        [5, 10, 11, 12]
    ]

上述示例中仅有元素5是所有子列表的共同成员。

问题

获取任意数量列表的共同元素的最Pythonic方法是什么?

现有解决方案

我目前的解决方案如下,但感觉可以更简洁:

y = x[0]
if len(x) > 1:
    for subset in x[1:]:
        x = list(set(x) & set(subset))

补充说明

输出应为包含所有共同元素的列表,上述示例的输出为[5];若存在两个共同元素(如5和foo),输出应为[5, "foo"]。


最优解决方案

方法1:简洁高效的集合交集法

Python处理多集合交集最简洁的方式是用set.intersection()配合解包操作,一行代码就能搞定:

common_elements = list(set.intersection(*map(set, x)))
  • 逻辑说明:map(set, x)把每个子列表转换为集合,*将这些集合逐一传入set.intersection(),最后转成列表得到结果。
  • 优势:相比循环逐次取交集,一次性处理所有集合的效率更高,代码逻辑也更直观。

方法2:保留元素原有顺序(按需选择)

上面的方法会因为集合的无序性打乱元素在原列表中的出现顺序,如果需要维持元素在第一个子列表里的顺序,可以这样写:

if not x:
    common_elements = []
else:
    common_set = set.intersection(*map(set, x[1:]))
    common_elements = [item for item in x[0] if item in common_set]
  • 逻辑说明:先计算除第一个列表外所有子列表的交集,再遍历第一个列表,筛选出在交集中的元素,从而保留原顺序。

对现有方案的优化点

你的代码逻辑是可行的,但有两处可以改进:

  1. 变量命名混乱:你用y初始化后又将结果存回x,容易造成混淆,建议用独立变量存储交集结果。
  2. 效率可提升:set.intersection()支持一次性处理所有集合,比循环逐次计算交集的效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:06:28