Tengo un diccionario anidado (árbol) con valores dados.
nodes = [{'id': 20, 'child': [{'id': 21, 'child': [{'id': 23, 'child': [{'id': 31}]}, {'id': 24}]}, {'id': 22}]}, {'id': 25, 'child': [{'id': 32}]}]
Me gusta actualizarlo con una nueva clave y valor (nivel: entero) en cada dicitonario. El nivel debe especificar el orden anidado (se muestra a continuación)
nodes = [{'id': 20, 'child': [{'id': 21, 'child': [{'id': 23, 'child': [{'id': 31}], 'level': 2}, {'id': 24}], 'level': 1}, {'id': 22}], 'level': 0}, {'id': 25, 'child': [{'id': 32}], 'level': 3}]
Intenté obtener la solución utilizando la recursividad. Pero debido al bucle for, esta solución es incorrecta.
counter=0
def abc(list):
global counter
for i in list:
if 'level' not in list:
if 'child' in i:
i.update(level=counter)
counter += 1
abc(i['child'])
return list
Puede usar la recursividad para lograr eso:
nodes = [{'id': 20, 'child': [{'id': 21, 'child': [{'id': 23, 'child': [{'id': 31}]}, {'id': 24}]}, {'id': 22}]}, {'id': 25, 'child': [{'id': 32}]}]
def set_level(obj, level=0):
if isinstance(obj, list):
# If the function is called on a list, we call the function on each element
return [set_level(el) for el in obj]
if isinstance(obj, dict):
# If the function in called on a dict, we add the level
obj['level'] = level
if "child" in obj:
# If the object have a sublevel, we call the function
# for this sublevel
obj["child"] = [set_level(c, level=level+1) for c in obj["child"]]
return obj
nodes = set_level(nodes)
Esta será la salida:
[
{
"child": [
{
"child": [
{
"child": [
{
"id": 31,
"level": 3
}
],
"id": 23,
"level": 2
},
{
"id": 24,
"level": 2
}
],
"id": 21,
"level": 1
},
{
"id": 22,
"level": 1
}
],
"id": 20,
"level": 0
},
{
"child": [
{
"id": 32,
"level": 1
}
],
"id": 25,
"level": 0
}
]
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras