Как объединить несколько вложенных словарей в один - PullRequest
1 голос
/ 02 апреля 2019

Если у меня есть 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" являются поддеревьями и т. Д.

Я пытался использовать рекурсию, но на самом деле понятия не имею, с чего начать

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Вы можете использовать рекурсию с 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']}}}
0 голосов
/ 02 апреля 2019

Поскольку каждый из ваших диктов содержит только один ключ, рекурсия вам на самом деле не нужна.Было бы более эффективно итеративно получать следующий внутренний дикт, пока вы не получите список, после чего вы расширяете подсписок списком:

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']}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...