如何在python中合并两个嵌套的dict?

时间:2017-05-05 05:43:45

标签: python dictionary

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

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

现在我尝试创建一个类似于它们的字典。必需输出

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

       }

我的尝试:

import json

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

dict1.update(dict2)
print(json.dumps(dict1, indent=2))

输出:

{
  "employee": {
    "dev2": "Biswas"
  }
}

我无法合并字典。需要合并它们的帮助

5 个答案:

答案 0 :(得分:4)

您可以更新内部词典。

Chart(data).mark_bar().encode(
   column='Gender',
   x='Genre',
   y='Rating',
   color='Gender'
)

答案 1 :(得分:1)

这里有一个解决方案,即使两个字典都有不同的密钥,并且你想要保留它们,也应该有效。

from collections import defaultdict

dict1 = {'employee': {'dev1': 'Roy'}, 'aKeyNotInDict2': {}}
dict2 = {'employee': {'dev2': 'Biswas'}, 'aKeyNotInDict1': {}}
merged_dict = defaultdict(dict)

merged_dict.update(dict1)
for key, nested_dict in dict2.items():
    merged_dict[key].update(nested_dict)

print(dict(merged_dict))

输出:

{
  'employee': {'dev2': 'Biswas', 'dev1': 'Roy'},
  'aKeyNotInDict2': {},
  'aKeyNotInDict1': {}
}

答案 2 :(得分:1)

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

dict1 = {'employee':{'devs':{'python':{'dev1':'Roy'}}}}
dict2 = {'employee':{'devs':{'cpp':{'dev1':'Biswas'}}}}

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

{'employee': {'devs': {'cpp': {'dev1': 'Biswas'}}}}

“直观”答案应该是:

{'employee': {'devs': {'python': {'dev1': 'Roy'}, 'cpp': {'dev1': 'Biswas'}}}}

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

以下是我对这种嵌套字典的尝试。它适用于使用递归的嵌套数据。而且它也有一些限制。例如,如果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)

答案 3 :(得分:0)

#use a dict comprehension. Adding {} in get() is to set a default return value if the key doesn't exist in dict1

{k:dict(dict1.get(k,{}).items() + v.items()) for k,v in dict2.items()}
Out[689]: {'employee': {'dev1': 'Roy', 'dev2': 'Biswas'}}

#Alternatively, a less readable way to merge the dicts using the dict constructor.

{k:dict(dict1.get(k,{}), **v) for k,v in dict2.items()}
Out[690]: {'employee': {'dev1': 'Roy', 'dev2': 'Biswas'}}

答案 4 :(得分:0)

[key1 == key2 and dict1.get(key1).update(dict2.get(key2)) 
 for key1, key2 in zip(dict1, dict2)]
print dict1