将2个嵌套的字典值组合到一个Python中

时间:2019-03-30 04:24:09

标签: python python-3.x python-2.7

我有以下两个命令,我想像下面这样将更新dict1dict2的值组合在一起。添加不存在的新密钥,并更新值。

dict1

{'https://site1.com': {'React': None, 'Drupal': '5.1','python':None}}

dict2

{'https://site1.com': {'React': '6.0', 'Drupal': '5.3','PHP':'7'},'https://site2.com':{'Rails':'6.1'}}

到以下输出:

final_dict

{'https://site1.com': {'React': '6.0', 'Drupal': '5.3','PHP':'7','python':None},'https://site2.com':{'Rails':'6.1'}}

4 个答案:

答案 0 :(得分:3)

您可以遍历dict2的项目并使用相同键的值更新dict1。使用dict.setdefault方法使用dict初始化新密钥:

for k, v in dict2.items():
    dict1.setdefault(k, {}).update(v)

使用示例输入,dict1将变为:

{'https://site1.com': {'React': '6.0', 'Drupal': '5.3', 'python': None, 'PHP': '7'}, 'https://site2.com': {'Rails': '6.1'}}

答案 1 :(得分:2)

final_dict = {**dict1, **dict2}

(适用于Python 3.5 +)

答案 2 :(得分:1)

final_dict = dict1.update(dict2)无效吗? Resource

编辑:哇,实际上不是。卢卡的答案是正确的。

答案 3 :(得分:1)

迭代两个字典中的键,如果两个都有值,请选择较大的(据我所知),通过递归组合它们来支持子字典:

更新:对不起,我误会了,当两个值都有价值时,您想使用dict2的值。

def combine_dict(dict1, dict2):
    final_dict = {}
    # iterate keys in two dict
    for k in dict1.keys() | dict2.keys():
        v1 = dict1.get(k, None)
        v2 = dict2.get(k, None)
        if isinstance(v1, dict) or isinstance(v2, dict):
            if not v1: v1 = {}
            if not v2: v2 = {}
            # combine recursively
            final_dict[k] = combine_dict(v1, v2)
        else:
            final_dict[k] = v2
            # if v1 and v2:
            #     final_dict[k] = max(v1, v2)
            # else:
            #     final_dict[k] = v1 or v2
    return final_dict

def test():
    dict1 = {'https://site1.com': {'React': None, 'Drupal': '5.1', 'python': None}}
    dict2 = {'https://site1.com': {'React': '6.0', 'Drupal': '5.3', 'PHP': '7'}, 'https://site2.com': {'Rails': '6.1'}}
    final_dict = {'https://site1.com': {'React': '6.0', 'Drupal': '5.3', 'PHP': '7', 'python': None},
                  'https://site2.com': {'Rails': '6.1'}}
    print(final_dict == combine_dict(dict1, dict2))     # output true

希望对您有所帮助,如有其他问题,请发表评论。 :)