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

