python - 字典的嵌套合并

标签 python dictionary

我有多个词典:

a = {
   "project_1": {
       "roles": ["role1"]
   },
   "project_4": ["foo"]
}

b = {
   "project_1": {
       "roles": ["role2"]
   },
   "project_2": {
       "roles": ["role4"]
   }
}
c = {
    "project_5": {
        "roles": ["role5"]
   }
}

如何合并这些字典以获得如下内容:

d = {
    "project_1": {
         "roles": ["role1","role2"]
    },
    "project_2": {
         "roles": ["role4"]
    },
    "project_4": ["foo"],
    "project_5": {
         "roles": ["role5"]
    }
}

从有关字典合并的其他问题中,我看到答案要么以预定方式覆盖值,依赖唯一键,要么针对 fixed number of dictionaries 。我需要为 2 个或更多字典保留相似键的嵌套值。

我的问题的限制是:

  • 每个字典有可变数量的键(“project_X”)
  • 字典的深度不固定,但有最大深度

最佳答案

您可以将itertools.groupby与递归一起使用:

import itertools
def group(_input):
  d = list(itertools.chain(*list(map(lambda x:list(x.items()), _input))))      
  _s = [[a, [c for _, c in b]] for a, b in itertools.groupby(sorted(d, key=lambda x:x[0]), key=lambda x:x[0])]
  return {a:group(b) if all(isinstance(i, dict) for i in b) else list(itertools.chain(*b)) for a, b in _s}

print(group([a, b, c]))

输出:

{'project_1': {'roles': ['role1', 'role2']}, 'project_2': {'roles': ['role4']}, 'project_4': ['foo'], 'project_5': {'roles': ['role5']}}

关于python - 字典的嵌套合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50750971/

相关文章:

python - 搜索 html 标签时 python 中的贪婪正则表达式错误

python 函数 for 字典中的循环

python - 提取字典列表中特定键的所有值 - 使用机器人框架

python - Pandas :根据条件将新列映射到现有列

python - 从主机运行 supervisord,从 virtualenv(Django 应用程序)运行 celery

Python 2.7 打印()错误

python - 按键合并字典数组

python - 如何删除 JSON 对象的属性

python - 在 Python 中检查类型的规范方法是什么?

python - 无法在不转换为 ascii 的情况下拆分 unicode 字符串 - python 2.7