首页 > 解决方案 > 更新字典值而不覆盖

问题描述

我有两个嵌套字典,它们可能包含相同的键但具有不同的值(即不同的内部字典但外部具有相同的键)

例如:

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 中的值。不需要覆盖,因为我想继续为现有键添加新值。这样做的正确方法是什么?

标签: pythondictionary

解决方案


您必须决定要合并多少级嵌套字典,但这是非常可行的:

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))

推荐阅读