Раскрыть словарь Python - PullRequest
       14

Раскрыть словарь Python

1 голос
/ 29 апреля 2020

У меня есть словарь, каждое значение в словаре - это список с 0 или более элементами, представляющими отношения parent: [children].

Например, my_dict = {'435': ['188', '436', '439', '1038'], '188': ['198'], '436': ['86', '115', '437', '444', '626', '650'], '439': [], '1038': ['733', '1037'], '198': [], '86': [], '115': [], '437': [], '444': [], '626': [], '650': [], '733': ['14'], '1037': [], '14': []}

Итак, родительский (и root узел) 435 имеет детей 188, 426, 439, 1038. Узел 188 имеет дочерний элемент 198, et c.

Я хотел бы открыть этот словарь (в конечном счете, я хотел бы, чтобы словарь был в формате d3, необходимом для чего-то вроде this (в частности, flare. json))

Желаемый синтаксис, [{"name": "435", "children": [{"name": "188", "children": [{"name": "198"}]}]}]

Я думал что-то вроде этого,

my_dict = {'435': ['188', '436', '439', '1038'], '188': ['198'], '436': ['86', '115', '437', '444', '626', '650'], '439': [], '1038': ['733', '1037'], '198': [], '86': [], '115': [], '437': [], '444': [], '626': [], '650': [], '733': ['14'], '1037': [], '14': []}

for key, value in list(my_dict.items()):
    if value != []:
        n = 0
        children = value
        for child in children:
            children[n] = {"name": child} 
            n = n + 1 

Или, возможно, рекурсивная функция была бы лучше? Я не уверен, как подойти к этому. Спасибо!

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Вы можете сделать это с помощью l oop. Это то, что вы хотите после?

my_dict = {'435': ['188', '436', '439', '1038'], '188': ['198'], '436': ['86', '115', '437', '444', '626', '650'], '439': [], '1038': ['733', '1037'], '198': [], '86': [], '115': [], '437': [], '444': [], '626': [], '650': [], '733': ['14'], '1037': [], '14': []}

table = {}
roots = set(my_dict)
for name, children in my_dict.items():
    table.setdefault(name, {'name': name})
    if children:
        table[name]['children'] = [
            table.setdefault(child, {'name': child})
            for child in children
        ]
        roots -= set(children)
result = {k: v for k, v in table.items() if k in roots}
print(list(result.values()))

вывод:

[{'name': '435', 'children': [{'name': '188', 'children': [{'name': '198'}]}, {'name': '436', 'children': [{'name': '86'}, {'name': '115'}, {'name': '437'}, {'name': '444'}, {'name': '626'}, {'name': '650'}]}, {'name': '439'}, {'name': '1038', 'children': [{'name': '733', 'children': [{'name': '14'}]}, {'name': '1037'}]}]}]

объяснение:

  • table содержит все элементы (имя и дочерние данные) .
  • Если элемент имеет children, зарегистрируйте его в table с помощью dict.setdefault.
  • roots содержит все элементы, которые не принадлежат другим элементам.
  • Наконец, отфильтруйте только те элементы, которые находятся в roots.
0 голосов
/ 29 апреля 2020

попробуйте использовать

# Python code to demonstrate  
# converting multi-d list into 1d list 
# using chain.from_iterables 

# import chain 
from itertools import chain 

ini_list = {'435': ['188', '436', '439', '1038'], '188': ['198'], '436': ['86', '115', '437', '444', '626', '650'], '439': [], '1038': ['733', '1037'], '198': [], '86': [], '115': [], '437': [], '444': [], '626': [], '650': [], '733': ['14'], '1037': [], '14': []}

# printing initial list 
for key in ini_list:

   # converting 2d list into 1d 
   # using chain.from_iterables 
   flatten_list = list(chain.from_iterable(ini_list[key])) 

   # printing flatten_list 
   print ("final_result", str(flatten_list)) 

Отсюда экстраполированное решение: Вундеркинды для гиков Я уверен, что это можно оптимизировать и дальше, но это должно сработать и, по сути, выбросить все в один список в каждая позиция dict выводит результат и затем инициализируется следующим ключом-значением dict.

Надеюсь, это поможет. Если это так, пожалуйста, отметьте как ответ. Спасибо

...