Работа с json деревом Python
Есть функция self.get_rubric(name: str)->list[dict[str,str]]. Она принимает имя региона и отдаёт список с словарями.
Пример ответа:
[
{'Севастополь': 'sevastopol-r'},
{'Восточный административный округ': 'vao'},
{'Западный административный округ': 'zao'},
{'Зеленоградский административный округ': 'zelao'},
{'Новомосковский административный округ': 'nao'},
{'Северный административный округ': 'sao'},
{'Северо-Восточный административный округ': 'svao'},
{'Северо-Западный административный округ': 'szao'},
{'Троицкий административный округ': 'tao'},
{'Центральный административный округ': 'tsao'},
{'Юго-Восточный административный округ': 'yuvao'},
{'Юго-Западный административный округ': 'yuzao'},
{'Южный административный округ': 'yuao'}
]
Нужно сделать цикл, чтобы получилось данное дерево.
{
"Москва": {
"link": "moskva",
"in": {
"Северо-Западный административный округ": {
"link": "szao",
"in": {
"Куркино": {
"link": "kurkino"
},
"Митино": {
"link": "mitino"
}
}
}
}
},
"Севастополь": {
"link": "sevastopol-r",
"in": {
"Севастополь": {
"link": "sevastopol-r"
}
}
},
"Смоленская область": {
"link": "smolenskaya-obl",
"in": {
"Гагарин": {
"link": "gagarin"
},
"Демидов": {
"link": "demidov"
}
}
}
}
Пока функция не вернёт self.get_rubric не вернёт None нужно добавлять элементы в in региона, по которому идёт поиск. Я пытался реализовать, но слишком запутался в лупах. Я пробывал данный метод(без добавления в json словарь), но он не работает корректно.
while len(regions) > 0:
regions_to_delete: list[dict[str, str]] = []
regions_to_add: list[dict[str, str]] = []
for region in regions:
region_name = list(region.keys())[0]
new_regions = self.get_region(region_name)
if new_regions == None:
continue
for new_region in new_regions:
regions_to_add.append(new_region)
regions_to_delete.append(region)
# Удаляем
for i in regions_to_delete:
regions.remove(i)
# Добавляем
for region in regions_to_add:
regions.append(region)
Ответы (1 шт):
Если брать список словарей, который вы указали в примере, то можно попробовать так:
rubric = [
{'Севастополь': 'sevastopol-r'},
{'Восточный административный округ': 'vao'},
{'Западный административный округ': 'zao'},
{'Зеленоградский административный округ': 'zelao'},
{'Новомосковский административный округ': 'nao'},
{'Северный административный округ': 'sao'},
{'Северо-Восточный административный округ': 'svao'},
{'Северо-Западный административный округ': 'szao'},
{'Троицкий административный округ': 'tao'},
{'Центральный административный округ': 'tsao'},
{'Юго-Восточный административный округ': 'yuvao'},
{'Юго-Западный административный округ': 'yuzao'},
{'Южный административный округ': 'yuao'}
]
new_rubric = dict()
district = dict()
city = None
link = None
for num, item in enumerate(rubric):
for cy in item:
if num == 0:
city = cy
link = item[cy]
else:
district.update({cy: {"link": item[cy]}})
new_rubric.update({city: {"link": link, "in": district}})
То есть, делаем два словаря. Так как у нас первый элемент это город, то забираем эти значения в переменные, все остальное добавляем во второй словарь. А затем обновляем первый словарь, добавив туда значения переменных и собранный второй словарь.