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

Python使用itertools.groupby实现多属性匹配分组的问题

你的需求本质是查找连通分量,itertools.groupby仅支持按固定静态Key分组,无法处理这种「只要属性值存在关联就合并」的动态分组场景,用并查集(DSU,不相交集合)实现最简便。

完整实现代码

from collections import defaultdict

class Node:
    def __init__(self, name1, name2, id_):
        self.name1 = name1
        self.name2 = name2
        self.id_ = id_
    def __repr__(self):
        return f"<{self.id_}>{self.name1}-{self.name2}"

# 并查集实现
class DSU:
    def __init__(self):
        self.parent = {}
    def find(self, x):
        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 = self.find(x)
        root_y = self.find(y)
        if root_x != root_y:
            self.parent[root_y] = root_x

l = [Node('WWA', 'KATO', 1), Node('WWA', 'POZ', 2), Node('SZCZ', 'GDN', 3), Node('GDN', 'BYD', 4), Node('BIA', 'OLS', 5), Node('LUB', 'WWA',6 )]

dsu = DSU()
# 合并每个节点的两个属性,同时关联所有有交集的属性
for node in l:
    dsu.union(node.name1, node.name2)

# 按根节点分组
groups = defaultdict(list)
for node in l:
    root = dsu.find(node.name1)
    groups[root].append(node)

result = list(groups.values())
print(result)

运行输出

[[<1>WWA-KATO, <2>WWA-POZ, <6>LUB-WWA], [<3>SZCZ-GDN, <4>GDN-BYD], [<5>BIA-OLS]]

和你期望的分组结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:24:03