Python匹配两个字典键追加嵌套对象的Pythonic实现方案咨询
问题解答
1. 直接更新原字典的风险
- 如果你后续业务逻辑不需要使用未添加
Snapshots字段的原始卷数据,直接更新原字典完全没问题,没有逻辑错误。 - 如果你后续还有其他逻辑依赖原始的
volume_dict结构,直接修改会产生副作用,更推荐生成独立的新字典,不修改原始数据源。
2. 更Pythonic的实现方式
简化版循环(修改原字典)
你原来的循环逻辑可以大幅简化,不需要额外创建临时value字典,也不需要重复判断键是否存在,直接用dict.get()方法即可:
import json volume_dict = { "vol-04f": { "Name": "db_server", "State": "in-use", "DataType": "Public", "Attachments": [ "i-0fc" ] }, "vol-0cc": { "Name": "app_server", "State": "in-use", "DataType": "Public", "Attachments": [ "i-051" ] } } snapshot_dict = { "vol-04f": [ { "snap-0086": { "Date": 20210911, "SnapshotState": "completed" } }, { "snap-06ff": { "Date": 20210910, "SnapshotState": "completed" } }, { "snap-0263": { "Date": 20210919, "SnapshotState": "completed" } } ] } for vol_id, vol_info in volume_dict.items(): vol_info["Snapshots"] = snapshot_dict.get(vol_id, {}) print(json.dumps(volume_dict, indent=4))
这里dict.get(key, default)会在键不存在时直接返回你指定的默认值(这里就是空对象{}),省掉了if-else分支。
字典推导式实现(不修改原字典,无副作用)
如果不想修改原始的volume_dict,可以用字典推导式直接生成最终的新字典,写法更简洁:
import json volume_dict = { "vol-04f": { "Name": "db_server", "State": "in-use", "DataType": "Public", "Attachments": [ "i-0fc" ] }, "vol-0cc": { "Name": "app_server", "State": "in-use", "DataType": "Public", "Attachments": [ "i-051" ] } } snapshot_dict = { "vol-04f": [ { "snap-0086": { "Date": 20210911, "SnapshotState": "completed" } }, { "snap-06ff": { "Date": 20210910, "SnapshotState": "completed" } }, { "snap-0263": { "Date": 20210919, "SnapshotState": "completed" } } ] } result = { vol_id: { **vol_info, "Snapshots": snapshot_dict.get(vol_id, {}) } for vol_id, vol_info in volume_dict.items() } print(json.dumps(result, indent=4))
这里用**vol_info展开原有卷的所有属性,再新增Snapshots字段,完全不会改动原始的volume_dict和snapshot_dict,更安全。
两种写法输出的结果都和你给出的预期完全一致。
内容的提问来源于stack exchange,提问作者Luke Walsh
相关产品推荐
相关产品推荐

