Python如何按自定义规则从字典生成指定结构嵌套列表
问题修复方案
你的代码存在几个核心逻辑错误:
- 遍历字典时直接删除键会触发遍历异常,且没有维护每个节点的所属层级,无法处理多层依赖、多值依赖的层级计算
- 嵌套列表初始化逻辑错误,没有按照传入的
var值预留对应数量的子列表位置 - 层级判断逻辑只做了单次匹配,没有实现「依赖值最小层级减1」的规则,遇到跨层依赖会分配错误位置
正确实现代码
# 原始数据,不要用dict作为变量名,会覆盖Python内置字典类 origin_dict = {'*1': '*3', '*2': '*3', '*3': '+1', '*4': '*5', '*5': '+2', '*6': '+3', '+1': '+2', '+4': '+5', '+5': '0', '+3': '0', '+2': '0'} var = 4 # 初始化结果列表,共var个空的子列表 result = [[] for _ in range(var)] # 记录每个键对应的子列表索引,方便快速查询依赖层级 key_level = dict() # 待处理的字典副本,避免修改原始数据 pending = origin_dict.copy() # 第一步:处理最后一层(值为'0'的键,对应索引var-1) last_level_keys = [k for k, v in pending.items() if v == '0'] result[var-1].extend(last_level_keys) # 更新层级记录 for k in last_level_keys: key_level[k] = var - 1 # 从待处理字典中移除已分配的键 del pending[k] # 循环处理直到所有键都分配完成 while pending: # 本轮要分配的键 current_round_keys = [] for k, v in pending.items(): # 只要当前键的依赖值已经分配了层级,就可以计算它的层级 if v in key_level: current_round_keys.append(k) # 给本轮收集到的键分配层级 for k in current_round_keys: dep_v = pending[k] # 规则:当前键层级 = 所有依赖值的最小层级 - 1 current_level = key_level[dep_v] - 1 result[current_level].append(k) key_level[k] = current_level # 从待处理字典移除 del pending[k] print(result)
运行上述代码会输出和预期完全一致的结果:[['*1', '*2'], ['*3', '*4'], ['+1', '*5', '*6', '+4'], ['+2', '+3', '+5']]
逻辑说明
- 从最底层(值为0的节点)开始反向推导每个节点的所属层级,每一轮只处理依赖已经完全确定的节点
- 计算层级时严格遵循「依赖节点的最小层级减1」规则,天然兼容多依赖、跨层依赖的场景
- 单独维护
key_level字典做层级查询,避免反复遍历已生成的子列表找元素,执行效率更高
内容的提问来源于stack exchange,提问作者user19375127
相关产品推荐
相关产品推荐

