Как получить глубину вложенных словарей во вложенных словарях в Python?

#python #python-3.x #dictionary #nested

Вопрос:

Я не уверен, что у меня просто мозговой блок здесь или это действительно должно быть проблемой, но у меня возникают проблемы с пониманием того, как проверить глубину вложенных словарей, если ключи неизвестны.

Вот пример того, что я пытаюсь сделать (самым простым/эффективным способом):

Оптимально, чтобы у меня был какой-то способ определить максимальную глубину этого диктанта, не зная ключей и значений —

 nested_dict = {  'nest1': {  'nest2': {  'nest3': 'val'  },  'unknown_key', 'val',  'unknown_key': 'val'  } }  

Пожалуйста, дайте мне знать, если это имеет смысл.

Комментарии:

1. Вы можете просмотреть каждое .values() из значений диктанта и проверить, является ли какое-либо из этих значений диктом. Затем рекурсивно проверьте значения этого диктанта.

2. В зависимости от контекста для хранения данных может оказаться более полезной другая структура данных (например, дерево).

3. Я переформатировал ваши данные, чтобы выделить синтаксическую ошибку для первого «неизвестного ключа» и дубликата ключа.

4. … и если вам не нужно рекурсивное решение, используйте очередь, чтобы выяснить, какие ветви вам нужно изучить. Т. е. это алгоритм поиска на вдохе или на глубине, который просто считается.

5. @9769953 Как выглядит древовидная структура данных в Python?

Ответ №1:

Проверьте, является ли это диктом, если да, повторите значения и рекурсивно вызовите функцию, чтобы получить максимальное значение.

PS : В Dict была синтаксическая ошибка, исправлена

 def max_depth(d):  if isinstance(d, dict):  return 1   max((max_depth(value) for value in d.values()), default=0)  return 0  nested_dict = {'nest1': {'nest2': {'nest3': 'val'}, 'unknown_key': 'val', 'unknown_key': 'val'}}   print(max_depth(nested_dict))  

Выход 3

Комментарии:

1. Большое спасибо! Это делает это. Программист-самоучка здесь, так что я не слишком знаком с рекурсией, но это отлично работает!

2. рад узнать, что это работает, поиграйте с кодом, чтобы понять, как это работает, если это помогло, вы можете пометить это решение как принятое @hdevs