如何在Python中合并两个嵌套的字典?

Ari*_*nda 4 python dictionary

我有两个嵌套的字典数据。我想将它们合并以在python中创建一个字典。字典数据:

dict1 = {'employee':{'dev1': 'Roy'}}
dict2 = {'employee':{'dev2': 'Biswas'}}
Run Code Online (Sandbox Code Playgroud)

现在,我尝试从中创建像波纹管这样的字典。所需输出

dict_output = {'employee':{
                    'dev1': 'Roy',
                    'dev2': 'Biswas'
                    }

       }
Run Code Online (Sandbox Code Playgroud)

我的尝试:

import json

dict1 = {'employee':{'dev1': 'Roy'}}
dict2 = {'employee':{'dev2': 'Biswas'}}

dict1.update(dict2)
print(json.dumps(dict1, indent=2))
Run Code Online (Sandbox Code Playgroud)

输出:

{
  "employee": {
    "dev2": "Biswas"
  }
}
Run Code Online (Sandbox Code Playgroud)

我无法合并这两个字典。需要帮助来合并它们

Ana*_*y R 9

这段代码是为了支持稍微不同的“合并”含义。假设我们有一个嵌套字典:

dict1 = {'employee':{'devs':{'python':{'dev1':'Roy'}}}}
dict2 = {'employee':{'devs':{'cpp':{'dev1':'Biswas'}}}}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,简单循环解决方案返回:

{'employee': {'devs': {'cpp': {'dev1': 'Biswas'}}}}
Run Code Online (Sandbox Code Playgroud)

虽然“直观”的答案应该是:

{'employee': {'devs': {'python': {'dev1': 'Roy'}, 'cpp': {'dev1': 'Biswas'}}}}
Run Code Online (Sandbox Code Playgroud)

这只是一个简单的例子,实际的例子可能要复杂得多。

下面是我对这样一个嵌套字典的尝试。它适用于使用递归的嵌套数据。而且它也有一些限制。例如,如果 dict1 和 dict2 具有相同的值但不是字典,则 dict2 具有优先权。另一方面,如果 dict1 包含字典,而 dict2 包含具有相同键的值,则优先级高于 dict1,而忽略 dict2。其他限制将需要更改代码。

def merge_dict(dict1, dict2):
    for key, val in dict1.items():
        if type(val) == dict:
            if key in dict2 and type(dict2[key] == dict):
                merge_dict(dict1[key], dict2[key])
        else:
            if key in dict2:
                dict1[key] = dict2[key]

    for key, val in dict2.items():
        if not key in dict1:
            dict1[key] = val

    return dict1

dict1 = merge_dict(dict1, dict2)
Run Code Online (Sandbox Code Playgroud)


Ahs*_*que 5

您可以只更新内部字典。

>>> dict1 = {'employee':{'dev1': 'Roy'}}
>>> dict2 = {'employee':{'dev2': 'Biswas'}}
>>> 
>>> for key in dict1:
...     if key in dict2:
...         dict1[key].update(dict2[key])
... 
>>> dict1
{'employee': {'dev2': 'Biswas', 'dev1': 'Roy'}}
Run Code Online (Sandbox Code Playgroud)