#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]))
Адаптируйтесь к вашим потребностям.