Python更新包括其他嵌套字典的嵌套字典

2024-06-16 14:00:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用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)

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


Tags: inchainforitems平面list词典d2
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}]}}}

使用递归遍历(假设所有源dict具有与最终期望值相同的深度级别列表

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}]}}

相关问题 更多 >