关于python:dicts的嵌套合并

Nested merge of dicts

本问题已经有最佳答案,请猛点这里访问。

我有多个字典:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
a = {
  "project_1": {
      "roles": ["role1"]
   },
  "project_4": ["foo"]
}

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

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

1
2
3
4
5
6
7
8
9
10
11
12
d = {
   "project_1": {
        "roles": ["role1","role2"]
    },
   "project_2": {
        "roles": ["role4"]
    },
   "project_4": ["foo"],
   "project_5": {
        "roles": ["role5"]
    }
}

从有关合并字典的其他问题中,我看到答案要么以预先确定的方式覆盖值,要么依靠唯一键,要么用于固定数量的字典。我需要为2个或更多字典保留类似键的嵌套值。

我的问题的限制是:

  • 每个字典都有可变数量的键("Project_x")。
  • 口述的深度不是固定的,而是最大的。


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

1
2
3
4
5
6
7
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]))

输出:

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