【问题标题】:Pythonic way toCompare two Dictionaries and Append Nested Object where keys match比较两个字典并附加键匹配的嵌套对象的 Pythonic 方法
【发布时间】:2021-11-08 06:39:57
【问题描述】:

Python 新手,有工作代码,但希望了解是否有更好的方法。

问题陈述 - 一个 python 字典包含有关卷的详细信息,第二个包含有关卷快照的详细信息。生成一个以每个卷为键的 json 文档,如果该卷有快照,则将快照字典对象添加为相应卷的 Snapshots 键下的嵌套字典。如果卷没有任何快照,只需在相应卷的 Snapshots 键下附加一个空对象作为嵌套字典即可。

  1. 有没有更 Pythonic 的方式来解决这个挑战(也许是理解)?
  2. 我更新原始字典是否出错?
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 Dictionary
snapshot_dict = {
    "vol-04f": [
        {
            "snap-0086": {
                "Date": 20210911,
                "SnapshotState": "completed"
            }
        },
        {
            "snap-06ff": {
                "Date": 20210910,
                "SnapshotState": "completed"
            }
        },
        {
            "snap-0263": {
                "Date": 20210919,
                "SnapshotState": "completed"
            }
        }
    ]
}

for volume_key, volume_value in volume_dict.items():
    if volume_key in snapshot_dict:
        value = {}
        snapshot_value = snapshot_dict.get(volume_key)
        value["Snapshots"] = snapshot_value
    else:
        value = {}
        value["Snapshots"] = {}
    volume_dict[volume_key].update(value)

print(json.dumps(volume_dict))

期望的输出

{
    "vol-04f": {
        "DataType": "Public",
        "State": "in-use",
        "Name": "db_server",
        "Snapshots": [
            {
                "snap-0086": {
                    "Date": 20210911,
                    "SnapshotState": "completed"
                }
            },
            {
                "snap-06ff": {
                    "Date": 20210910,
                    "SnapshotState": "completed"
                }
            },
            {
                "snap-0263": {
                    "Date": 20210919,
                    "SnapshotState": "completed"
                }
            }
        ],
        "Attachments": [
            "i-0fc"
        ]
    },
    "vol-0cc": {
        "DataType": "Public",
        "State": "in-use",
        "Name": "app_server",
        "Snapshots": {},
        "Attachments": [
            "i-051"
        ]
    }
}

【问题讨论】:

    标签: python json dictionary comparison dictionary-comprehension


    【解决方案1】:

    dict.get 有默认值,在找不到 key 时返回,你可以利用它:

    for k, v in volume_dict.items():
        v["Snapshots"] = snapshot_dict.get(k, {})
    
    print(volume_dict)
    

    打印:

    {
        "vol-04f": {
            "Name": "db_server",
            "State": "in-use",
            "DataType": "Public",
            "Attachments": ["i-0fc"],
            "Snapshots": [
                {"snap-0086": {"Date": 20210911, "SnapshotState": "completed"}},
                {"snap-06ff": {"Date": 20210910, "SnapshotState": "completed"}},
                {"snap-0263": {"Date": 20210919, "SnapshotState": "completed"}},
            ],
        },
        "vol-0cc": {
            "Name": "app_server",
            "State": "in-use",
            "DataType": "Public",
            "Attachments": ["i-051"],
            "Snapshots": {},
        },
    }
    

    【讨论】:

    • 感谢 Andrej Kesely,这非常有效,并且恰好是我测试中最快的方法。非常感谢您的帮助。
    【解决方案2】:

    第一季度

    如果你想使用列表推导,这就是方式

    [volume_dict[volume_key].update({"Snapshots": snapshot_dict[volume_key] if volume_key in snapshot_dict else {}})  for volume_key, volume_value in volume_dict.items()]
    

    更简单的方法是

    for volume_key, volume_value in volume_dict.items():
        volume_dict[volume_key]["Snapshots"] = snapshot_dict[volume_key] if volume_key in snapshot_dict else {}
    

    第二季度

    这将根据您的要求。如果您以后想使用原始 volume_dict,最好获取副本并更新。

    【讨论】:

    • 谢谢 CodeProcessor。您的两种方法都有效,您对问题 2 的建议值得考虑。
    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多