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")。
- 口述的深度不是固定的,而是最大的。
您可以将
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']}} |