我正在从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)
它适用于任何级别的嵌套词典。