如何基于嵌套字典的键数量对列表进行层级分组?
按嵌套字典层级键数分组列表的递归实现方案
输入数据
嵌套字典
{"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)
代码说明
- 迭代器的优势:
iter(x)将列表转为迭代器,每次调用next()自动取下一个元素,无需手动维护索引位置,逻辑更简洁不易出错。 - 递归层级匹配:
- 最外层字典有3个键(Africa、Asia、Australia),对应结果外层的3个列表
- 每个子字典的键数决定了对应子列表的长度,完全匹配需求
- 叶子节点处理:当遇到值不为字典的节点时,取当前字典的键数量作为元素提取个数,生成子列表后跳出循环,避免重复处理同一叶子节点的其他键。
内容的提问来源于stack exchange,提问作者DevD
相关产品推荐
相关产品推荐

