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

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

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

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

  • python - проверка нечетных / четных чисел и изменение выходов на размер номера
  • присоединяться или сливаться с перезаписью в пандах
  • Значение важности с помощью XGBClassifier
  • установить cx_oracle для python
  • Python MySQL управляет специальными символами
  • Python не работает в командной строке git bash
  • Правильно Установка и настройка Python / Pyside / PyDev на OS X Lion (и, вероятно, будущие версии OS X)
  • Быстрее для oswalk или glob?
  • 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'}) 
    Python - лучший язык программирования в мире.