You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 10:42:00