首页 > 解决方案 > 遍历一个列表并将数据添加到 Python 中另一个嵌套的字典列表中

问题描述

我这里有个问题:

orgn_data = [{ "host1" : [{'port': 8080, 'name': 'data1'}, {'port': 8000, 'name': 'data2'}, {'port': 80, 'name': 'data3'}]},
             {"host2": [{'port': 443, 'name': 'data1'}, {'port': 8000, 'name': 'data2'}]}
            ]

res_data = [{'host1': ['1', '0', '1']}, {'host2': ['1', '0']}] 

基本上, res_data 是与 orgn_data 列表具有相同主机的结果列表。我想将同一主机的 res_data 以相同的顺序合并到 orgn 列表中。
我可以保证 res_data 的顺序与 orgn_data 本身相同。但是,外部列表可能并不总是与它总是相同的顺序(可能是多个主机)。这意味着,必须首先查找主机名才能获得正确的配对。

最终结果应如下所示:

final_data = [{ "host1" : [{'port': 8080, 'name': 'data1', "status": 1}, {'port': 8000, 'name': 'data2', "status": 0}, {'port': 80, 'name': 'data3', "status": 1}]},
              {"host2": [{'port': 443, 'name': 'data1', "status": 1}, {'port': 8000, 'name': 'data2', "status": 0}]}
             ]

做这个的最好方式是什么?非常感谢这个!

标签: pythonpython-3.xlist

解决方案


已经有一些很好的答案,我添加了一个itertools.groupby

from itertools import groupby

for k, (orgn, res) in groupby(sorted(orgn_data + res_data, key=lambda k: [*k.keys()][0]), lambda k: [*k.keys()][0]):
    for v, s in zip(orgn[k], res[k]):
        v['status'] = s

print(orgn_data)

印刷:

[{'host1': [{'port': 8080, 'name': 'data1', 'status': '1'}, {'port': 8000, 'name': 'data2', 'status': '0'}, {'port': 80, 'name': 'data3', 'status': '1'}]}, 
 {'host2': [{'port': 443, 'name': 'data1', 'status': '1'}, {'port': 8000, 'name': 'data2', 'status': '0'}]}]

推荐阅读