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

Python如何高效提取嵌套列表中关联共现的元素分组

问题背景

给定存储元素两两共现关系的嵌套列表:

results = [[1,2],[2,1],[3,0],[0,3],[3,4],[2,5]]

需要提取所有存在直接/间接关联的元素分组,期望输出格式如下(组内元素顺序无要求):

result = [[1,2,5],[3,0,4]]

要求实现方案避免大量多层循环,优先保证性能。

实现方案

这个需求本质是无向图的连通分量查找问题,最高效的实现方式是使用带路径压缩的并查集(Disjoint Set Union, DSU),整体时间复杂度接近线性,无多层嵌套循环,在大数据量下性能远高于暴力匹配方案。

实现思路

  • 将每个共现对中的两个元素视作无向图中相连的两个节点
  • 初始化时每个元素自身作为独立集合
  • 遍历所有共现对,将对中两个元素所属的集合合并
  • 最终将同一集合下的所有元素归集为一组,即为所求结果

完整代码

class DSU:
    def __init__(self):
        self.parent = dict()

    def find(self, x):
        # 路径压缩优化,将查找路径上的节点直接挂到根节点,后续查找速度接近O(1)
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]

    def union(self, x, y):
        # 未出现过的节点初始化父节点为自身
        if x not in self.parent:
            self.parent[x] = x
        if y not in self.parent:
            self.parent[y] = y
        # 合并两个节点所属集合
        root_x, root_y = self.find(x), self.find(y)
        if root_x != root_y:
            self.parent[root_y] = root_x

def extract_cooccur_groups(pairs):
    dsu = DSU()
    for a, b in pairs:
        dsu.union(a, b)
    # 按根节点归集所有同组元素
    group_map = dict()
    for node in dsu.parent:
        root = dsu.find(node)
        group_map.setdefault(root, []).append(node)
    return list(group_map.values())

# 测试调用
if __name__ == "__main__":
    results = [[1,2],[2,1],[3,0],[0,3],[3,4],[2,5]]
    output = extract_cooccur_groups(results)
    print(output)
    # 输出结果为 [[1,2,5],[3,0,4]] (组内元素顺序不固定,符合要求)

方案特点

  • 性能优异:带路径压缩的并查集单次操作时间复杂度为反阿克曼函数级别,可视为常数时间,哪怕处理百万级别的共现对也能快速完成
  • 鲁棒性强:输入中存在对称重复对(比如同时存在[1,2]和[2,1])时不会干扰结果,无需提前对输入做去重处理
  • 无额外依赖:纯Python实现,不需要安装第三方库
  • 逻辑简洁:全程最多两层平级遍历,无深层嵌套循环

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:09:45