python dictionary depth

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