小能豆

更新不同深度的嵌套字典的值

python

我正在寻找一种方法来用dictionary1dict 的内容更新 dictupdate而不覆盖levelA

dictionary1 = {
    "level1": {
        "level2": {"levelA": 0, "levelB": 1}
    }
}
update = {
    "level1": {
        "level2": {"levelB": 10}
    }
}
dictionary1.update(update)
print(dictionary1)
{
    "level1": {
        "level2": {"levelB": 10}
    }
}

我知道更新会删除 level2 中的值,因为它正在更新最低键 level1。

鉴于 dictionary1 和 update 可以有任意长度,我该如何解决这个问题?


阅读 38

收藏
2024-08-26

共1个答案

小能豆

dictionary1使用 的内容进行更新update而不覆盖 中的现有键levelA,可以递归合并字典。此方法可确保仅update更改 中的指定键,而其他键保持不变。

您可以按照以下方式实现此目的:

def merge_dicts(dict1, dict2):
    for key in dict2:
        if key in dict1 and isinstance(dict1[key], dict) and isinstance(dict2[key], dict):
            merge_dicts(dict1[key], dict2[key])
        else:
            dict1[key] = dict2[key]

dictionary1 = {
    "level1": {
        "level2": {"levelA": 0, "levelB": 1}
    }
}

update = {
    "level1": {
        "level2": {"levelB": 10}
    }
}

merge_dicts(dictionary1, update)
print(dictionary1)

解释:

  • 递归函数:是合并到的merge_dicts(dict1, dict2)递归函数。dict2``dict1

  • 键检查

:对于中的每个键

dict2

,检查该键是否也存在于中

dict1

以及两个值是否都是字典。

  • 如果是的话,它会递归调用merge_dicts以在嵌套级别合并它们。
  • 如果没有,它就直接dict1使用 中的值进行更新dict2

输出:

运行此代码将得到:

{
    "level1": {
        "level2": {"levelA": 0, "levelB": 10}
    }
}

这样,levelA保持不变,只levelB用新值进行更新。此方法适用于任何长度和深度的字典。

2024-08-26