【问题标题】:Python recursively merge deeply nested dictionaries and create a list for values which key is overlappedPython递归合并深度嵌套的字典并为键重叠的值创建一个列表
【发布时间】:2022-01-20 19:09:19
【问题描述】:

dict1:

{
    'level_1_a': 1,
    'level_1_b': {
        'level_2_a': 2,
        'level_2_b': {
            'level_3_a': 3
        },
        'level_2_c': {
            'level_3_b': 4
        }
    }
}

dict2:

{
    'level_1_a': 2,
    'level_1_b': {
        'level_2_a': 2,
        'level_2_b': {
            'level_3_a': 2
        },
        'level_2_c': {
            'level_3_b': 2
        }
    }
}  

期望的输出:

{
    'level_1_a': [1,2]
    'level_1_b': {
        'level_2_a': 2,
        'level_2_b': {
            'level_3_a': [3,2]
        },
        'level_2_c': {
            'level_3_b': [4,2]
        }
    }
}  

我想在不替换键项的情况下递归合并字典,并在键存在时为值创建一个列表。 level_2_a 上所需的输出可以是单级列表。

【问题讨论】:

  • 添加示例输入和所需输出。
  • @dawg 给你

标签: python dictionary


【解决方案1】:

这是一个递归合并:

import collections.abc

def merge(a, b, path=None):
  if path is None: path = []
  for key in b:
    if key in a:
      if isinstance(a[key], collections.abc.Mapping) and isinstance(b[key], collections.abc.Mapping):
        merge(a[key], b[key], path + [str(key)])
      elif a[key] != b[key]:
        a[key]=[a[key],b[key]]
      else:
        pass
    else:
      a[key] = b[key]
  return a

用你的例子:

>>> merge(dict1,dict2)
>>> dict1
{"level_1_a": [1, 2], 
 "level_1_b": {
      "level_2_a": 2, 
      "level_2_b": {
           "level_3_a": [3, 2]}, 
      "level_2_c": {
           "level_3_b": [4, 2]}}}

注意:dict a 具有破坏性,因此如果您想要原始 LH dict,请进行深层复制。

注意2:这在应用中是超级有限的。主要是给出的例子。如果值是列表或字典等,则不起作用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-12
    • 2021-12-16
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 2021-08-03
    • 2018-03-25
    相关资源
    最近更新 更多