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
相关产品推荐
相关产品推荐

