python - 遍历一个列表并将数据添加到 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}]}
]
做这个的最好方式是什么?非常感谢这个!
解决方案
已经有一些很好的答案,我添加了一个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'}]}]
推荐阅读
- r - 确定火山图上过滤了哪些 RNA SEQ 数据
- c++ - 计算素数的总和
- typescript - 定义没有索引签名的打字稿对象形状
- java - 如何在Android的谷歌地图片段中更改默认蓝色圆形位置图标?
- java - 在 Fusion Web 应用程序中单击按钮后重新加载 ADF 表
- modeling - 如何在经典的星型模式中对多个产品进行建模?
- javascript - 在 Angular 中为图片标签添加 404 后备
- java - 按谓词拆分 Java 列表并为每个子列表映射不同的函数
- onclick - alpine.js,如何使元素在 self @click 上消失?
- python - How to load cudf in colab?