【问题标题】:python update nested dictionary with other nested dictionary [duplicate]python用其他嵌套字典更新嵌套字典[重复]
【发布时间】:2019-12-04 11:32:49
【问题描述】:

我想用dd1和dd2来更新dd3

dd1 = {'a': {'b': [{'x':1}]}}
dd2 = {'a': {'c': [{'x':2}]}}
dd3 = {'a': {'b': {}, 'c': {}}}

所以我得到了 dd3:

dd3 = {'a': {'b': [{'x':1}], 'c': [{'x':2}]}}

我知道如何更新平面字典

d1 = {'a': 1, 'b': 2, 'c': 3}
d2 = {'a': 2, 'b': 3, 'd': 4}

d3 = defaultdict(list)

for k, v in chain(d1.items(), d2.items()):
    d3[k].append(v)

但很难找到更新嵌套字典的清晰方法:

【问题讨论】:

    标签: python dictionary nested


    【解决方案1】:

    使用递归遍历(假设所有源字典具有相同的深度级别列表作为最终预期的更新值):

    dd1 = {'a': {'b': [{'x':1}]}}
    dd2 = {'a': {'c': [{'x':2}]}}
    dd3 = {'a': {'b': {}, 'c': {}}}
    
    def update_nested_dict(target, d1, d2):
        for k,v in target.items():
            d1_v, d2_v = d1.get(k, []), d2.get(k, [])
            if isinstance(v, dict):
                if not v:
                    target[k] = d1_v + d2_v
                else:
                    update_nested_dict(v, d1_v, d2_v)
    
    update_nested_dict(dd3, dd1, dd2)
    print(dd3)
    

    输出:

    {'a': {'b': [{'x': 1}], 'c': [{'x': 2}]}}
    

    【讨论】:

    • 如果我有更多的字典,例如dd1, dd2, ... , ddN 用于更新 dd_out (dd3) ?
    • 输出字典在每个级别可能有多个键,因为输入字典可能是例如{'g': {'b': [{'x':1}]}} 所以 dd3 将在 'a' 旁边的级别 1 中将 'g' 作为第二个键。 dd3 = {'a': {'b': {}, 'c': {}}, 'g': {'b': {}}}
    • @naivepredictor,好的,扩展您的输入样本以反映 ad.2 部分,尤其是 number of dd1 nesting levels does not always equal to number of dd2 nesting levels
    【解决方案2】:

    你可以使用递归:

    dd1 = {'a': {'b': [{'x':1}]}}
    dd2 = {'a': {'c': [{'x':2}]}}
    dd3 = {'a': {'b': {}, 'c': {}}}
    def update(d, *args):
        return {a:(lambda x:x[0] if not b else update(b, *x))([i[a] for i in args if a in i])\
                if isinstance(b, dict) else b for a, b in d.items()}
    
    print(update(dd3, dd1, dd2))
    

    输出:

    {'a': {'b': [{'x': 1}], 'c': [{'x': 2}]}}
    

    此解决方案可以处理不同深度的多个字典:

    dd1 = {'a': {'b':{'d':{'e':[{'x':1}]}}}}
    dd2 = {'a': {'c': [{'x':2}]}}
    dd4 = {'a':{'j':{'k':[{'x':3}]}}}
    dd3 = {'a': {'b': {'d':{'e':{}}}, 'c': {}, 'j':{'k':{}}}}
    print(update(dd3, dd1, dd2, dd4))
    

    输出:

    {'a': {'b': {'d': {'e': [{'x': 1}]}}, 'c': [{'x': 2}], 'j': {'k': [{'x': 3}]}}}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      • 2022-01-25
      • 2022-06-13
      • 2018-05-31
      • 2021-05-17
      • 2018-06-02
      相关资源
      最近更新 更多