请求实现嵌套分组值展开算法:合并子分组值至父分组(Python优先)
分组值展开算法实现(Python)
问题描述
现有如下表格数据:
| Group | Value |
|---|---|
| G1 | V1 |
| G1 | V2 |
| G2 | V1 |
| G2 | V3 |
| G3 | V4 |
| G4 | G2 |
| G4 | V5 |
需要实现算法将每个分组的所有值展开:若分组的Value包含其他分组名称,需将该子分组的所有值合并到父分组中,最终输出格式为 分组名=值1,值2,...,预期结果:
G1=V1,V2 G2=V1,V3 G3=V4 G4=V1,V3,V5
Python 实现方案
思路
- 将原始数据转换为分组-值列表的字典映射,方便快速查询分组对应的初始值。
- 编写递归函数处理分组展开:遍历分组的每个值,若值是其他分组的名称,则递归展开该子分组的所有值;若为普通值则直接保留。
- 对展开后的结果去重(避免子分组与父分组有重复值的情况),保证结果简洁。
- 遍历所有分组,格式化输出最终结果。
代码实现
# 原始数据,可从表格读取或直接定义 raw_data = [ ("G1", "V1"), ("G1", "V2"), ("G2", "V1"), ("G2", "V3"), ("G3", "V4"), ("G4", "G2"), ("G4", "V5"), ] # 构建初始分组字典 group_map = {} for group, value in raw_data: if group not in group_map: group_map[group] = [] group_map[group].append(value) def expand_group(group_name): """递归展开分组的所有值,处理嵌套分组引用""" expanded = [] seen = set() # 用于去重 for val in group_map.get(group_name, []): # 如果当前值是一个分组,则递归展开该分组 if val in group_map: for sub_val in expand_group(val): if sub_val not in seen: seen.add(sub_val) expanded.append(sub_val) else: # 普通值直接添加(去重) if val not in seen: seen.add(val) expanded.append(val) return expanded # 输出所有分组的展开结果 for group in group_map: expanded_values = expand_group(group) print(f"{group}={','.join(expanded_values)}")
代码说明
group_map:把原始数据转换成字典结构,键为分组名,值为该分组对应的初始值列表,便于快速查询。expand_group:递归处理分组展开逻辑,用seen集合过滤重复值,确保最终结果无冗余。- 最后遍历所有分组,调用展开函数并按要求格式化输出,与预期结果完全匹配。
注意事项
- 如果存在循环分组引用(比如G1包含G2,G2又包含G1),递归会进入死循环,此时需要添加已访问分组的记录逻辑来避免。
- 若不需要去重,可以直接移除
seen集合相关代码,直接追加值即可。
内容的提问来源于stack exchange,提问作者Teresa Sergiel
相关产品推荐
相关产品推荐

