python - Conoce la profundidad de un diccionario.
dictionary depth (4)
Suponiendo que tenemos este dict:
d = {''a'':1, ''b'': {''c'':{}}}
¿Cuál sería la forma más sencilla de conocer la profundidad de anidación?
Necesitas crear una función recursiva:
>>> def depth(d):
... if isinstance(d, dict):
... return 1 + (max(map(depth, d.values())) if d else 0)
... return 0
...
>>> d = {''a'':1, ''b'': {''c'':{}}}
>>> depth(d)
3
Solución iterativa:
from collections import deque
def depth(d):
q = deque([d])
q2 = deque()
max_depth = 0
while q:
curr_dict = q.popleft()
if isinstance(curr_dict, dict):
for di in curr_dict.itervalues():
q2.append(di)
if not q:
q, q2 = q2, q
max_depth += 1
return max_depth
print depth(None)
print depth({})
print depth({"a": "b"})
print depth({"a": "b", "c": {"d": "e"}, "f": {"g": "h"}, "i": {"j": "k"}, "x": {}, "z": {} })
print depth({''a'':1, ''b'': {''c'':{}}})
print depth({''foo'': {''bar'': {''baz'': 0}, ''spam'': {''ham'': {''monty'': 1}, ''eric'': ''idle''}}, ''john'': ''cleese''})
Tendrás que repetir
def depth(d, level=1):
if not isinstance(d, dict) or not d:
return level
return max(depth(d[k], level + 1) for k in d)
max()
es necesario para seleccionar la mayor profundidad para el diccionario actual bajo escrutinio en cada nivel, un diccionario con 3 claves de cada profundidad diferente debe reflejar la mayor profundidad en ese nivel.
Manifestación:
>>> d = {''a'':1, ''b'': {''c'':{}}}
>>> depth(d)
3
>>> d = {''foo'': {''bar'': {''baz'': 0}, ''spam'': {''ham'': {''monty'': 1}, ''eric'': ''idle''}}, ''john'': ''cleese''}
>>> depth(d)
5
Una solución no recursiva:
def depth(d):
depth=0
q = [(i, depth+1) for i in d.values() if isinstance(i, dict)]
max_depth = 0
while (q):
n, depth = q.pop()
max_depth = max(max_depth, depth)
q = q + [(i, depth+1) for i in n.values() if isinstance(i, dict)]
print max_depth