【发布时间】:2021-12-14 16:31:31
【问题描述】:
我在如下列表中有一个 json 格式的数据:-
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}]}]
从这个列表中,我想在键 steps 的值中添加一个新键 details,并且只将 score 键作为 value 附加到新键。我例外的输出如下:-
output =[{'score': 76, 'steps': [{'details':{'score': 49}, 'len': 261,'details': {'score': 27}, 'len': 172,'details': {'score': 0}, 'len': 0}]},
{'score': 82, 'steps': [{'details':{'score': 82}, 'len': 484, 'details':{'score': 0}, 'len': 0 }]},
{'score': 51, 'steps': [{'details':{'score': 51}, 'len': 268,'details': {'score': 0}, 'len': 0,'details':{'score': 16}, 'len': 75, 'details':{'score': 187}, 'len': 47}]}]
现在,我尝试创建一个新密钥details 并尝试附加value,但它显示dictionary size is changed while iterating。为了避免这种情况,我使用了 list(j.keys()) 但如果我使用它,那么我将无法访问该字典的值。有没有更好的方法来解决这个问题?
for i in lis_t:
for k,v in i.items():
if k == 'steps':
for j in v:
for key,val in j.items():
j['details']=val
print(key)
错误:
RuntimeError: dictionary changed size during iteration
异常输出:-
output=[{'score': 76, 'steps': [{'details':{'score': 49}, 'len': 261,'details': {'score': 27}, 'len': 172,'details': {'score': 0}, 'len': 0}]},
{'score': 82, 'steps': [{'details':{'score': 82}, 'len': 484, 'details':{'score': 0}, 'len': 0 }]},
{'score': 51, 'steps': [{'details':{'score': 51}, 'len': 268,'details': {'score': 0}, 'len': 0,'details':{'score': 16}, 'len': 75, 'details':{'score': 187}, 'len': 47}]}]
【问题讨论】:
-
如果我理解正确,我认为您要求的内容与我的要求相似。我认为这最好通过列表理解来解决。我的帖子有帮助吗? stackoverflow.com/questions/68717392/…
-
您想要的输出语法无效,在 python 中是不可能的。您有具有键的列表项。列表使用索引。因此,您可能希望将这些列表更改为 dicts 或重新排列存储“len”数据的方式。
-
请提供正确的输出格式(要求),提供的格式不正确
-
for a in lis_t: for b in a['steps']: b['details'] = {'score': b.pop('score')}.
标签: python json list dictionary