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

如何基于嵌套字典的键数量对列表进行层级分组?

按嵌套字典层级键数分组列表的递归实现方案

输入数据

嵌套字典

{"Africa":{"All":{"ABC":0,"DEF":0,"GHI":0},"NA":{"GHI":0},"EXPORT":{"ABC":0,"DEF":0,"GHI":0},"RE-EXPORT":{"ABC":0,"DEF":0,"GHI":0}},"Asia":{"All":{"ABC":0,"DEF":0,"GHI":0},"NA":{"ABC":0,"DEF":0},"RE-EXPORT":{"ABC":0,"GHI":0}},"Australia":{"All":{"DEF":0,"GHI":0},"NA":{"ABC":0,"DEF":0,"GHI":0}}}

待分组列表

x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]

目标结果

result =  [[[1,2,3],[4],[5,6,7],[8,9,10]],[[11,12,13],[14,15],[16,17]],[[18,19],[20,21,22]]]

实现思路

核心逻辑是借助迭代器+递归:

  • 用迭代器遍历列表x,自动维护当前取数位置,避免手动计算索引
  • 递归遍历嵌套字典的每个层级:遇到子字典则递归处理,遇到叶子节点(值非字典)则按当前层级的键数提取对应数量的元素

代码实现

def group_by_dict_structure(data_iter, nested_dict):
    result = []
    for val in nested_dict.values():
        if isinstance(val, dict):
            # 递归处理子字典,生成子分组
            sub_group = group_by_dict_structure(data_iter, val)
            result.append(sub_group)
        else:
            # 叶子节点:按当前字典的键数提取元素
            count = len(nested_dict.keys())
            sub_list = [next(data_iter) for _ in range(count)]
            result.append(sub_list)
            break  # 叶子节点处理完成,退出循环
    return result

# 初始化数据
nested_dict = {"Africa":{"All":{"ABC":0,"DEF":0,"GHI":0},"NA":{"GHI":0},"EXPORT":{"ABC":0,"DEF":0,"GHI":0},"RE-EXPORT":{"ABC":0,"DEF":0,"GHI":0}},"Asia":{"All":{"ABC":0,"DEF":0,"GHI":0},"NA":{"ABC":0,"DEF":0},"RE-EXPORT":{"ABC":0,"GHI":0}},"Australia":{"All":{"DEF":0,"GHI":0},"NA":{"ABC":0,"DEF":0,"GHI":0}}}
x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]

# 转换为迭代器并生成结果
x_iter = iter(x)
result = group_by_dict_structure(x_iter, nested_dict)
print(result)

代码说明

  1. 迭代器的优势:iter(x)将列表转为迭代器,每次调用next()自动取下一个元素,无需手动维护索引位置,逻辑更简洁不易出错。
  2. 递归层级匹配:
    • 最外层字典有3个键(Africa、Asia、Australia),对应结果外层的3个列表
    • 每个子字典的键数决定了对应子列表的长度,完全匹配需求
  3. 叶子节点处理:当遇到值不为字典的节点时,取当前字典的键数量作为元素提取个数,生成子列表后跳出循环,避免重复处理同一叶子节点的其他键。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:20:48