Вложенный словарь из вложенного списка - PullRequest
0 голосов
/ 24 октября 2018

У меня есть вложенный список, как :.

[['A', 'A1'], ['A1', 'B', 'C'], ['B', 'B1', 'B2'], ['B1', 'b1', 'b2', 'b3',
 'B2', 'd1', 'd2', 'd3', 'd4'], ['C', 'C1', 'C2', 'C3'], ['C1', 'a1', 'a2', 'a3','C2', 'n1', 'n2', 'n3', 'n4','C3', 'x1', 'x2', 'x3', 'x4']]

Я хочу создать вложенный словарь, например:

{'A': {'A1': {'B': {'B1': {'b1': {}, 'b2': {}, 'b3': {}},
                    'B2': {'d1': {}, 'd2': {}, 'd3': {}, 'd4': {}}},
              'C': {'C1': {'a1': {}, 'a2': {}, 'a3': {}},
                    'C2': {'n1': {}, 'n2': {}, 'n3': {}, 'n4': {}},
                    'C3': {'x1': {}, 'x2': {}, 'x3': {}, 'x4': {}}}}}}                                                                                   

или:

{'A': {'A1': {'B': {'B1': ['b1', 'b2' 'b3', 'b4'],
                    'B2': ['d1', 'd2', 'd3', 'd4']},
              'C': {'C1': ['a1', 'a2', 'a3'],
                    'C2': ['n1', 'n2', 'n3', 'n4'],
                    'C3': ['x1', 'x2', 'x3', 'x4']}}}                        

Я пробовал что-то подобное.

d = {}
for path in in nested_list:                                                
    current_dict = d                                                    
     for part in path:                                                            
          if part not in current_ dict:                                    
                current_dict [part]={}                                                         

, но без получения желаемого результата

Файлы примеров

[1.txt] (https://i.stack.imgur.com/dIYmb.jpg[2.txt(https://i.stack.imgur.com/brDUz.jpg)[3.txt(https://i.stack.imgur.com/HaTwd.jpg) 4.txt 5.txt

1 Ответ

0 голосов
/ 24 октября 2018

РЕДАКТИРОВАТЬ ПРИМЕЧАНИЕ : Вы изменили ввод в своем вопросе после того, как я дал этот ответ.Следующее решение относится к вашему старому вводу, где список списков был:

[['A', 'A1'], ['A1', 'B', 'C'], ['B', 'B1', 'B2'], ['B1', 'b1', 'b2', 'b3'],
 ['B2', 'd1', 'd2', 'd3', 'd4'], ['C', 'C1', 'C2', 'C3'], ['C1', 'a1', 'a2', 'a3'],
 ['C2', 'n1', 'n2', 'n3', 'n4'], ['C3', 'x1', 'x2', 'x3', 'x4']]

Предполагая, что ваш список списков хранится в переменной l, вы можете использовать следующий цикл for для построениясловарь с отображением словаря p для отслеживания родительского узла для каждого ключа:

d = {}
p = {}
for k, *s in l:
    r = p.get(k, d)[k] = {i: {} for i in s}
    p.update({i: r for i in s})

d станет:

{'A': {'A1': {'B': {'B1': {'b1': {}, 'b2': {}, 'b3': {}},
                    'B2': {'d1': {}, 'd2': {}, 'd3': {}, 'd4': {}}},
              'C': {'C1': {'a1': {}, 'a2': {}, 'a3': {}},
                    'C2': {'n1': {}, 'n2': {}, 'n3': {}, 'n4': {}},
                    'C3': {'x1': {}, 'x2': {}, 'x3': {}, 'x4': {}}}}}}

Чтобы сделать листовые узлы спискомВы можете пройти по дереву снизу вверх и использовать набор m, чтобы отслеживать дочерние узлы, чтобы вы могли использовать набор разностей, чтобы найти все верхние узлы, которые нужно добавить в основной словарь d в конце:

p = {}
m = set()
while l:
    k, *s = l.pop()
    p[k] = {i: p[i] for i in s} if all(i in p for i in s) else s
    m.update(s)
d = {i: p[i] for i in p.keys() - m}

d станет:

{'A': {'A1': {'B': {'B1': ['b1', 'b2', 'b3'],
                    'B2': ['d1', 'd2', 'd3', 'd4']},
              'C': {'C1': ['a1', 'a2', 'a3'],
                    'C2': ['n1', 'n2', 'n3', 'n4'],
                    'C3': ['x1', 'x2', 'x3', 'x4']}}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...