Работа с 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 шт):

Автор решения: Johan

Если брать список словарей, который вы указали в примере, то можно попробовать так:

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}})

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

→ Ссылка