如何将多个嵌套词典合并到

2024-04-29 16:11:33 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有n个不同深度的嵌套字典,其中嵌套最深的字典的值作为一个列表

例如:

{"a":{"b": {"c": {"d": ["ab"]}}}},
{"a" : {"b": {"d": ["aa"]}}}, 
{"a": {"f":{"c":["xx"]}}}, 
{"a":{"b": {"c": {"d": ["ef"]}}}}

我怎样才能把这些结合起来

{"a": {"b": {"c": {"d": ["ab","ef"]}}, "d": ["aa"]}, "f":{"c":["xx"]}}}

这可以看作是一棵树,其中"a"是整棵树的父树,"b""f"是子树,依此类推。你知道吗

我试过使用递归,但实际上我不知道从哪里开始


Tags: 列表字典abaaxxef父树
2条回答

因为每个dict只包含一个键,所以实际上不需要递归。迭代地获取下一个内部dict,直到得到一个列表,此时可以使用列表扩展子列表,这样效率会更高:

l = [
    {"a": {"b": {"c": {"d": ["ab"]}}}},
    {"a": {"b": {"d": ["aa"]}}},
    {"a": {"f": {"c": ["xx"]}}},
    {"a": {"b": {"c": {"d": ["ef"]}}}}
]
o = {}
for d in l:
    n = o
    m = d
    p = None
    while isinstance(m, dict):
        if p is not None:
            if k not in p:
                p[k] = {}
            n = p[k]
        (k, m), = m.items()
        p = n
    p.setdefault(k, []).extend(m)

o变成:

{'a': {'b': {'c': {'d': ['ab', 'ef']}, 'd': ['aa']}, 'f': {'c': ['xx']}}}

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

from itertools import groupby
data = [{"a":{"b": {"c": {"d": ["ab"]}}}}, {"a" : {"b": {"d": ["aa"]}}}, {"a": {"f":{"c":["xx"]}}}, {"a":{"b": {"c": {"d": ["ef"]}}}}]
def group(d):
  if all(not isinstance(i, dict) for i in d):
    return [i for b in d for i in b]
  r = [i for b in d for i in b.items()]
  _d = [[a, [c for _, c in b]] for a, b in groupby(sorted(r, key=lambda x:x[0]), key=lambda x:x[0])]
  return {a:b[0] if len(b) == 1 else group(b) for a, b in _d}

print(group(data)) 

输出:

{'a': {'b': {'c': {'d': ['ab', 'ef']}, 'd': ['aa']}, 'f': {'c': ['xx']}}}

相关问题 更多 >