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

请求实现嵌套分组值展开算法:合并子分组值至父分组(Python优先)

分组值展开算法实现(Python)

问题描述

现有如下表格数据:

GroupValue
G1V1
G1V2
G2V1
G2V3
G3V4
G4G2
G4V5

需要实现算法将每个分组的所有值展开:若分组的Value包含其他分组名称,需将该子分组的所有值合并到父分组中,最终输出格式为 分组名=值1,值2,...,预期结果:

G1=V1,V2
G2=V1,V3
G3=V4
G4=V1,V3,V5

Python 实现方案

思路

  1. 将原始数据转换为分组-值列表的字典映射,方便快速查询分组对应的初始值。
  2. 编写递归函数处理分组展开:遍历分组的每个值,若值是其他分组的名称,则递归展开该子分组的所有值;若为普通值则直接保留。
  3. 对展开后的结果去重(避免子分组与父分组有重复值的情况),保证结果简洁。
  4. 遍历所有分组,格式化输出最终结果。

代码实现

# 原始数据,可从表格读取或直接定义
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 03:46:14