我正在寻找一种方法来用dictionary1dict 的内容更新 dictupdate而不覆盖levelA
dictionary1
update
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 可以有任意长度,我该如何解决这个问题?
要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
merge_dicts(dict1, dict2)
dict2``dict1
键检查
:对于中的每个键
dict2
,检查该键是否也存在于中
dict1
以及两个值是否都是字典。
merge_dicts
运行此代码将得到:
{ "level1": { "level2": {"levelA": 0, "levelB": 10} } }
这样,levelA保持不变,只levelB用新值进行更新。此方法适用于任何长度和深度的字典。
levelB