python - 更新字典值而不覆盖
问题描述
我有两个嵌套字典,它们可能包含相同的键但具有不同的值(即不同的内部字典但外部具有相同的键)
例如:
dict_a = {"2": {"2": 0, "12": "94960", "25": "61026"}, "229": {"101": "29043", "106": "25298", "110": "48283", "112": "16219", "126": "35669", "147": "37675"}}
dict_b = {{"1": {"1": 0, "2": "84543", "3": "34854", "5": "123439}, "229": {"2": "71355", "12": "24751", "25": "33600", "229": 0}}
这里键“229”存在于两个外部字典中,但与不同的值相关联(不同的内部字典)
我首先得到 dict_a,然后得到 dict_b。然后我想用从 dict_b 添加的所有键和值来更新 dict_a。IE
dict_a_updated = {"2": {"2": 0, "12": "94960", "25": "61026"}, "229": {"101": "29043", "106": "25298", "110": "48283", "112": "16219", "126": "35669", "147": "37675", "2": "71355", "12": "24751", "25": "33600", "229": 0}}}
{{"1": {"1": 0, "2": "84543", "3": "34854", "5": "123439}}
我试过 .update 方法:
dict_a_updated = dict_a.update(dict_b)
结果是 dict_b 中的键“229”及其值将覆盖 dict_a 中的值。不需要覆盖,因为我想继续为现有键添加新值。这样做的正确方法是什么?
解决方案
您必须决定要合并多少级嵌套字典,但这是非常可行的:
dict_a = {"2": {"2": 0, "12": "94960", "25": "61026"},
"229": {"101": "29043", "106": "25298", "110": "48283", "112": "16219", "126": "35669", "147": "37675"}}
dict_b = {"1": {"1": 0, "2": "84543", "3": "34854", "5": "123439"},
"229": {"2": "71355", "12": "24751", "25": "33600", "229": 0}}
for k, v in dict_b.items():
if k in dict_a:
for sub_k, sub_v in v.items():
if sub_k in dict_a[k]: #decide what to do when there's a conflict at this level
print("conflict: keeping value from dict_a")
else:
dict_a[k][sub_k] = sub_v #add missing item to dict_a[k]
else:
dict_a[k] = v #add missing item to dict_a
print(dict_a)
将问题扩展到合并任意数量的级别是一个简单的递归问题(尽管您必须确保您的数据结构是一致的,并决定如何解决数据中的冲突):
def recursive_merge(dict_a, dict_b, levels):
for k, v in dict_b.items():
if k in dict_a:
if levels > 1 and isinstance(v, dict) and isinstance(dict_a[k], dict):
recursive_merge(dict_a[k], dict_b[k], levels - 1)
else:
pass #keep the value from dict_a
else:
dict_a[k] = v
return dict_a
print(recursive_merge(dict_a, dict_b, 2))
推荐阅读
- wordpress - 将 wordpress 部署到 bitbucket
- aws-lambda - python lambda无法导入用户定义的模块
- forms - Nette getHttpData 包括未选中的复选框
- visual-studio-code - 在 Visual Studio Code 中键入表达式时出现重复提示
- wordpress - 来自 FPDF 的 Wordpress 数据库连接
- vba - 如何使用 vba 脚本检查 MS Word 段落行距
- android - 如何通过简单适配器在列表视图(android)中使用/获取任何行项的位置,而不通过点击侦听器获取它?
- angular - Angular 4 - 从 scss 文件中按名称读取规则
- autodesk-forge - 问题将 css 加载到按钮 Autodesk Forge
- c# - 通过两个项目共享 AppConfigurations.json