J'ai une liste de niveaux comme
levels = [["A", "B", "C", "D"], ["A", "B"], ["A", "B", "X"]]
En réponse, le dictionnaire imbriqué devrait apparaître comme suit
{
"name": "A",
"parent": -1,
"children": [
{
"name": "B",
"parent": "A",
"children": [
{
"name": "C",
"parent": "B",
"children": [
{
"name": "D",
"parent": "C",
}
],
},
{
"name": "X",
"parent": "B"
}
],
}
]
}
Je sais qu'il me manque quelque chose dans la boucle de récursion.
Voici mon code jusqu'à présent
import csv
import json
class AutoVivification(dict):
"""Implementation of perl's autovivification feature."""
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value
def master_tree(data, payload, parent = -1):
if len(data) == 1:
if data[0] not in payload['name']:
payload = {'name':data[0], "parent": parent}
else:
if data[0] in payload['name']:
for k in payload['children']:
master_tree(data[1:], k, data[0])
else:
payload = {'name': data[1], "parent": data[0], 'children':[master_tree(data[1:], payload, data[0])]}
return payload
payload = AutoVivification()
payload = master_tree(["A", "B", "X"], payload)
payload = master_tree(["A", "B", "C", "D"], payload)
print json.dumps(payload, indent=4)
Le problème se pose lorsque la même structure est répétée. Par exemple, A->B->C->D est déjà présent à la première itération et lorsque A->B est passé à nouveau, il devrait idéalement le sauter et dans le dernier cas, il devrait ajouter juste X nœud sous B.