Python3嵌套字典覆盖



我正在从JSON文件加载两个字典

# var_dict_config
{
"application" : {
"alias" : "process-io-y",
"version" : "10.5.0.17 - Ghost Revision: 10",
"log_level" : "debug",
"log_file"  : "log/debug.log",
"application_startup_delay" : "0"
},
"io" : {
"io_mode" : "gpio.bcm",
"io_warnings" : "on",
"io_startup_test" : "on",
"mapping" : {
"io_01" : {
"pin"   : "05",
"mode"  : "output",
"state" : "off",
"lockout" : "off"
},
"io_02" : {
"pin"   : "06",
"mode"  : "output",
"state" : "off",
"lockout" : "off"
}
}
}
}


# var_dict_config_overwrite
{
"application" : {
"alias"  : "bare-y",
"version" : "xxxx"
},
"io" : {
"io_mode" : "gpio.bcm",
"io_warnings" : "xxxxx",
"io_startup_test" : "xxxxx"
}
}
}

我想将值从var_dict_config_overwrite复制到var_dict-config

下面的代码有效,但不适用于嵌套字典

var_dict_config = {**var_dict_config, **var_dict_config_overwrite}

目前我正在做这个

var_dict_config['application'] = {**var_dict_config['application'], **var_dict_config_overwrite['application']}

有更优雅的方法吗?

为了完成测试,我在var_dict_config_overwrite字典的两个不同位置添加了两个不同的密钥,分别命名为"addition1""addition2"

这是你们的字典:

var_dict_config = {
"application": {
"alias": "process-io-y",
"version": "10.5.0.17 - Ghost Revision: 10",
"log_level": "debug",
"log_file": "log/debug.log",
"application_startup_delay": "0"
},
"io": {
"io_mode": "gpio.bcm",
"io_warnings": "on",
"io_startup_test": "on",
"mapping": {
"io_01": {
"pin": "05",
"mode": "output",
"state": "off",
"lockout": "off"
},
"io_02": {
"pin": "06",
"mode": "output",
"state": "off",
"lockout": "off"
}
}
}
}

var_dict_config_overwrite = {
"application": {
"alias": "bare-y",
"version": "xxxx"
},
"io": {
"io_mode": "gpio.bcm",
"io_warnings": "xxxxx",
"io_startup_test": "xxxxx",
"addition1": {"addition1": "foo1",
"addition2": "foo2"}
},
"addition2": {"addition2": "foo2",
"addition3": "foo3"}
}

您可以通过如下递归合并函数来实现这一点:

def recursive_merge(d1, d2):
for k, v in d2.items():
if k in d1:
if isinstance(v, dict):
recursive_merge(d1[k], v)
else:
d1[k] = v
else:
d1[k] = v
return d1

for k, v in recursive_merge(var_dict_config, var_dict_config_overwrite).items():
print(k, v)

它适用于任何级别的嵌套词典。

最新更新