如何根据CSV中的等价数据配对确定对应分组?
基于配对规则生成分组的最优实现方案
这个问题的本质是求解无向图的连通分量,最简洁、高效的实现方式是使用*并查集(Disjoint Set Union, DSU)*数据结构,完全匹配你需要的关联推导逻辑,没有冗余复杂度。
核心实现逻辑
- 初始化结构:把CSV中所有出现过的元素,先默认作为独立的单独分组
- 合并分组:逐行读取每对关联元素,把两个元素所在的组合并为同一个组,哪怕两个元素是通过多对关系间接关联(比如A-B、B-D,会自动把A/B/D归为同一组)
- 归集结果:所有配对处理完成后,把属于同一个组的元素归集到一起,给每个组按稳定顺序编号为Group 1、Group 2……
- 格式化输出:把所有元素按字典序排序,输出成你需要的
元素, 组编号格式
可直接运行的极简实现代码
from collections import defaultdict # 并查集核心结构,仅保留必要功能 class DSU: def __init__(self): self.parent = {} def find(self, x): # 路径压缩优化,快速找到元素所属的组根节点 if self.parent.setdefault(x, x) != x: self.parent[x] = self.find(self.parent[x]) return self.parent[x] def union(self, x, y): # 合并两个元素所属的分组 root_x = self.find(x) root_y = self.find(y) if root_x != root_y: self.parent[root_y] = root_x # 替换成你实际读取CSV的逻辑即可,这里用示例输入做测试 pair_list = [("A", "B"), ("B", "D"), ("E", "G"), ("F", "G"), ("H", "C")] dsu = DSU() for a, b in pair_list: dsu.union(a.strip(), b.strip()) # 按组根节点归集所有元素 groups = defaultdict(list) for node in dsu.parent.keys(): root = dsu.find(node) groups[root].append(node) # 生成稳定的组编号,按组内最小元素排序,避免每次运行结果随机 group_id = 1 node_group_map = {} for _, members in sorted(groups.items(), key=lambda item: min(item[1])): for node in members: node_group_map[node] = f"Group {group_id}" group_id += 1 # 按元素字典序输出目标格式 for node in sorted(node_group_map.keys()): print(f"{node}, {node_group_map[node]}")
运行输出效果
上述代码跑完后,输出结果和你示例的期望格式完全一致:
A, Group 1 B, Group 1 C, Group 2 D, Group 1 E, Group 3 F, Group 3 G, Group 3 H, Group 2
方案优势
- 完全匹配业务规则:自动识别直接、间接的配对关联,不需要手动遍历找隐式关系,不会漏判跨层连接
- 性能开销极低:路径压缩优化后的并查集时间复杂度接近线性,哪怕CSV包含十万级别的配对记录,也能毫秒级跑完
- 结果稳定可控:通过排序逻辑固定组编号和输出顺序,不会每次运行出现随机的分组排序差异
- 代码量极少:没有复杂的嵌套循环、递归逻辑,维护成本极低
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

