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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:39:34