Как определить глубину словаря, содержащего список словарей?

#python #json #python-3.x #algorithm #dictionary

Вопрос:

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

это входные данные, которые я привел в качестве примера :

 respons = {
    "root":{
        "Flow":[{
            "Name":"BSB1",
            "Output":[{
                "Name":"BSB2",
                "Output":[{
                    "Name":"BSB5",
                    "Output":[{
                        "Name":"BSB6",
                        "Output":[{
                            "Name":"BSB8",
                            "Output":[]
                        }]
                    },
                    {
                        "Name":"BSB7",
                        "Output":[]
                    }]
                }]
            },
            {
                "Name":"BSB3",
                "Output":[{
                    "Name":"BSB4",
                    "Output":[]
                }]
            }]
        }]
    }
}

 
 def calculate_depth(flow,depth):
    depth =1
    md = []
    if flow['Output']:
        for o in flow['Output']:
            print(o['BusinessUnit'])
            md.append(calculate_depth(o,depth))
        print(max(md))
        print(md)
        return max(md)
    else:
        return depth
        

print(calculate_depth(respons['root']['Flow'][0],0))


 

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

Редактировать

Желаемый результат будет для этой структуры : 5 Почему ? Это самая длинная ветвь BSB1 => BSB2 =>> BSB5 =>>> BSB6 =>>>> BSB8

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

1. Не могли бы вы, пожалуйста, добавить, каков желаемый результат? То есть, какова ожидаемая глубина словаря в вопросе (и в идеале объясните, почему). Кроме того, можете ли вы отредактировать свой вопрос, чтобы включить то, что возвращает ваш код (и почему это не является желаемым результатом)?

2. @Nikolaoshatzis Я обновил вопрос, Спасибо заранее

Ответ №1:

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

 respons['root']['Flow'][0]['Output'][0]['Output'][0]
#                      ^^^          ^^^          ^^^ ...not a level?
 

И обратимся к листьям этого дерева: является ли самый глубокий [] уровень уровнем?

Вот код, который учитывает только диктанты как добавление к уровню, и только тогда, когда они не пусты:

 def calculate_depth(thing):
    if isinstance(thing, list) and len(thing):
        return 0   max(calculate_depth(item) for item in thing)
    if isinstance(thing, dict) and len(thing):
        return 1   max(calculate_depth(item) for item in thing.values())
    return 0
 

Это выводит 19 для примера данных:

 print(calculate_depth(respons['root']['Flow'][0]))
 

Адаптируйтесь к вашим потребностям.