Преобразование плоского списка диктов в дерево иерархииPython

Программы на Python
Ответить
Anonymous
 Преобразование плоского списка диктов в дерево иерархии

Сообщение Anonymous »

У меня возникли проблемы при попытке преобразовать следующий список:
lst = [
{"id": 0, "job": "CEO", "ManagerID": 0, "name": "John Smith"},
{"id": 1, "job": "Medical Manager", "ManagerID": 0, "name": "Medic 1"},
{"id": 2, "job": "Medical Assist", "ManagerID": 1, "name": "Medic 2"},
{"id": 3, "job": "ICT Manager", "ManagerID": 0, "name": "ICT 1"},
{"id": 4, "job": "ICT Assist", "ManagerID": 3, "name": "ICT 2"},
{"id": 5, "job": "ICT Junior", "ManagerID": 4, "name": "ICT 3"}
]

В формате типа
output = [
{"id": 0, "job": "CEO", "ManagerID": 0, "name": "John Smith", "children" : [
{ "id":1, "job": "Medical Manager", "name": "Medic 1", "children" : [
{"id": 2, "job": "Medical Assist", "name": "Medic 2"}
]
},
{"id": 3, "job": "ICT Manager", "name": "ICT 1", "children":[
{"id": 4, "job": "ICT Assist", "name": "ICT 2", "children" : [
{"id": 5, "job": "ICT Junior", "name": "ICT 3"}
]}
]}
],
}]

Там, где есть один корневой узел (ManagerID = 0), все остальное разветвляется.
Я пытался адаптировать код из другого вопроса, но мне не удалось создать этот необходимый формат.
Код, который я использовал, выглядит следующим образом, но он все еще имеет повторения родительских узлов.
classes = [] #everyones id
for item in lst:
name = item['id']
if name not in classes:
classes.append(name)

treenodes = {}
root_node = None

for item in lst: # Create tree nodes
item['children'] = []
name = item['id']
treenodes[name] = item
parent = item['ManagerID']
if parent not in classes: # parent is root node, create
if parent not in treenodes:
node = {}
node['ManagerID'] = 0 #set manager to root
node['children'] = []
node['id'] = parent
root_node = node
treenodes[parent] = node

# Connect parents and children
for item in lst: # Create tree nodes
parent = item['ManagerID']
parent_node = treenodes[parent]
parent_node['children'].append(item)

output = treenodes
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»