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

Python如何给嵌套字典新增键并解决循环迭代时字典大小变化报错

错误原因

  • 你在遍历j.items()的过程中直接修改字典j(新增details键),Python不允许迭代字典的同时修改其大小,所以触发RuntimeError
  • 原有逻辑也存在问题:你不需要遍历steps子项的所有键,需求仅需要提取score字段的值即可,完全不需要遍历字典
  • 另外你贴的预期输出存在语法错误:同一个字典中不允许存在重复的details键,正确的结构应该是steps列表的每个元素(单条字典)各新增一个details键,对应的值为{"score": 原score值}

正确实现代码

lis_t=[{'score': 76, 'steps': [{'score': 49, 'len': 261}, {'score': 27, 'len': 172}, {'score': 0, 'len': 0}]},
{'score': 82,'steps': [{'score': 82, 'len': 484}, {'score': 0, 'len': 0 }]}, 
{'score': 51, 'steps': [{'score': 51, 'len': 268}, {'score': 0, 'len': 0},{'score': 16, 'len': 75}, {'score': 187, 'len': 47}]}]

for item in lis_t:
    # 直接取steps字段,不需要遍历所有键
    steps = item.get('steps', [])
    for step_item in steps:
        # 直接给当前step字典新增details键,不需要遍历step的键
        step_item['details'] = {'score': step_item['score']}

# 打印验证结果
print(lis_t)

执行后得到的正确结构如下:

[
    {'score': 76, 'steps': [
        {'score': 49, 'len': 261, 'details': {'score': 49}},
        {'score': 27, 'len': 172, 'details': {'score': 27}},
        {'score': 0, 'len': 0, 'details': {'score': 0}}
    ]},
    {'score': 82, 'steps': [
        {'score': 82, 'len': 484, 'details': {'score': 82}},
        {'score': 0, 'len': 0, 'details': {'score': 0}}
    ]},
    {'score': 51, 'steps': [
        {'score': 51, 'len': 268, 'details': {'score': 51}},
        {'score': 0, 'len': 0, 'details': {'score': 0}},
        {'score': 16, 'len': 75, 'details': {'score': 16}},
        {'score': 187, 'len': 47, 'details': {'score': 187}}
    ]}
]

通用迭代修改字典的规避方案

如果你遇到确实需要遍历字典修改的场景,正确的规避方式是先把键值对转成列表再遍历,就不会触发大小变更报错:

# 仅做通用场景演示,本需求不需要用这个写法
for key, val in list(j.items()):
    # 此处修改j的结构不会触发报错
    pass

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:45:05