Знать глубину словаря

Предположим, что у нас есть этот дикт:

d = {'a':1, 'b': {'c':{}}} 

Какой был бы самый простой способ узнать глубину гнездования?

4 Solutions collect form web for “Знать глубину словаря”

Вам придется рекурсивно:

 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() необходим для выбора наибольшей глубины для текущего словаря, находящегося под пристальным вниманием на каждом уровне, словарь с 3 ключами каждой разной глубины должен отражать наибольшую глубину на этом уровне.

Демо-версия:

 >>> d = {'a':1, 'b': {'c':{}}} >>> depth(d) 3 >>> d = {'foo': {'bar': {'baz': 0}, 'spam': {'ham': {'monty': 1}, 'eric': 'idle'}}, 'john': 'cleese'} >>> depth(d) 5 

Вам нужно создать рекурсивную функцию:

 >>> 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 

Нерекурсивное решение:

 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 

Итеративное решение:

 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'}) 
Interesting Posts

Разбор строки, представляющей список кортежей

PIL и numpy

Google appengine: производительность очереди задач

Pandas «Может только сравнивать идентично помеченные объекты DataFrame»

Как передать объект Pandas DataFrame между процессами?

Как избежать повторного входа в мои аккаунты каждый раз, Selenium Python mac

Django: использование аннотата, графа и отличия в Queryset

Самый pythonic способ разрезать список Python каждые 100 элементов

Извлечь изображение JPEG из перенаправленного URL и отобразить его в окне графического интерфейса пользователя

Проблемы с декодированием в Django и lxml

Именованная группа регулярных выражений "(? P <имя_группы> regexp)": что означает "P"?

изменять цвет каждого бара на барграфе с использованием определенного значения

Argparse – не улавливайте позиционные аргументы с `nargs`.

Maya Python API 2.0 не имеет MItDag, так как график прохождения DAG?

GAE – Как жить без объединений?

Python - лучший язык программирования в мире.