【问题标题】:How to add a new key to an existing dictionary and append previous key as value to the new key created in a for loop : python如何向现有字典添加新键并将前一个键作为值附加到在 for 循环中创建的新键:python
【发布时间】: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


【解决方案1】:

我会使用列表推导来重置“步数”值。可能是这样的:

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:
    item["steps"] = [
        {"details": {"score": step_item["score"]}, "len": step_item["len"]}
        for step_item in item["steps"]
    ]

import json
print(json.dumps(lis_t))

这给出了:

[
    {
        "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}
        ]
    }
]

我认为你追求的是什么。

【讨论】:

  • 非常感谢,这么简单
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多