Создание вложенного словаря на основе отношений между родителями и детьми? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть список словарей, подобных этому:

[
    {'A': ['B', 'C', 'D']},
    {'B': ['E', 'F']},
    {'C': ['E']},
    {'F': ['G', 'H']}
]

Ключ в словаре является родителем соответствующего значения словаря, т. Е. {parent: [child1, child2, child3]}

Как я могусоздайте древовидный словарь в следующем формате, например:

{'A':{'B':{'E': None,
           'F': {'G': None,
                 'H': None}
          },
      'C': {'E': None}}

Если узел не имеет дочернего элемента, мы заполним его значение значением None.Я не знаю, как написать рекурсивный процесс для преобразования списка в словарь, любая идея?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Вы можете использовать рекурсию:

d = [{'A': ['B', 'C', 'D']}, {'B': ['E', 'F']}, {'C': ['E']}, {'F': ['G', 'H']}]
d1 = dict(list(i.items())[0] for i in d)
def flatten_structure(d, root = 'A'):
  if root:
    return {root:flatten_structure(d1[root], None)}
  return {i:flatten_structure(d1[i], None) if i in d1 else None for i in d}

print(flatten_structure(d1['A']))

Вывод:

{'A': {'B': {'E': None, 'F': {'G': None, 'H': None}}, 'C': {'E': None}, 'D': None}}
0 голосов
/ 16 мая 2018

Вы можете сделать это с помощью рекурсивной функции:

def find_set(d, k, v):
    for key, value in d.items():
        if isinstance(value, dict):
            find_set(d[key], k, v)
            return
        if key == k:
            d[key] = {}
            for i in v:
                d[key][i] = None
            return d
    d[k] = {}
    for i in v:
        d[k][i] = None
    return d

Код:

l = [{'A': ['B', 'C', 'D']}, {'B': ['E', 'F']}, {'C': ['E']}, {'F': ['G', 'H']}]

d = {}
for node in l:
    for key, value in node.items():
        find_set(d, key, value)

d будет:

{'A': {'B': {'E': None, 'F': {'G': None, 'H': None}, 'C': {'E': None}}, 'C': None, 'D': None}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...