【问题标题】:How to merge two dictionaries without clobbering如何在不破坏的情况下合并两个字典
【发布时间】:2019-12-01 21:33:59
【问题描述】:

我有两本词典,我想将它们合并。

dict1 = {'abc': {'test1': 123}}
dict2 = {'abc': {'test2': 456}}

我想结束

{'abc': {'test1': 123, 'test2': 456}}

如果dict2 = {'abc': 100} 那么我想要:

{'abc' 100}

我尝试了dict1.update(dict2),但这给了我{'abc': {'test2': 456}}

有没有pythonic方法可以做到这一点?

【问题讨论】:

  • dict2 中 'abc' 的值不是字典会是什么输出?
  • 当两个字典中的元素在同一个键下具有不同的类型值时,您的合并应该如何操作?
  • @Tino:后面应该重写,好问题。
  • @RaySteam: if dict2 = {'abc': 100} 我想要 {'abc': 100},如果是 dicts 然后合并
  • 这能回答你的问题吗? Can I have a dictionary with same-name keys?

标签: python


【解决方案1】:

IIUC,您可以执行以下操作:

def recursive_update(d1, d2):
    """Updates recursively the dictionary values of d1"""

    for key, value in d2.items():
        if key in d1 and isinstance(d1[key], dict) and isinstance(value, dict):
            recursive_update(d1[key], value)
        else:
            d1[key] = value


dict1 = {'abc': {'test1': 123}}
dict2 = {'abc': {'test2': 456}}

recursive_update(dict1, dict2)

print(dict1)

输出

{'abc': {'test1': 123, 'test2': 456}}

请注意,递归仅适用于作为字典的值。例如:

dict1 = {'abc': {'test1': 123}}
dict2 = {'abc': 100}

产生(如预期):

{'abc': 100}

【讨论】:

    【解决方案2】:

    您在字典中有一个字典,并且您想用另一个字典的内部字典更新内部字典。所以你必须将更新方法应用于内部字典:

    dict1["abc"].update(dict2["abc"])
    

    【讨论】:

      【解决方案3】:

      您可以将collections.defaultdict 与字典一起使用。

      from collections import defaultdict
      
      merge = defaultdict(dict)
      
      # Handle nesting
      for d in [dict1, dict2]:
          for k0, v0 in d.items():
              for k1, v1 in v0.items():
                  merge[k0][k1] = v1  # Assign to defaultdict
      print(dict(merge))  # -> {'abc': {'test1': 123, 'test2': 456}}
      

      或者你可以使用dict.setdefault

      merge = {}
      
      for d in [dict1, dict2]:
          for k0, v0 in d.items():
              merge.setdefault(k0, {})
              for k1, v1 in v0.items():
                  merge[k0][k1] = v1
      print(merge)  # -> {'abc': {'test1': 123, 'test2': 456}}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-21
        • 2015-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-20
        • 2013-08-29
        • 1970-01-01
        相关资源
        最近更新 更多