@rsytrade

Как правильно рекурсивно обойти словарь?

Есть некий список многоуровневых словарей. Известно что в каждом словаре есть ключ key и вложенный список словарей subCategories. Список словарей subCategories может быть пустым, а может содержать список других словарей с аналогичной структурой (key и subCategories). Вот пример списка:
list_dict = [
    {
        'key': 'name',
        'subCategories': [
            {
                'key': 'name',
                'subCategories': [
                    {
                        'key': 'name',
                        'subCategories': [],
                    },
                    {
                        'key': 'name',
                        'subCategories': [],
                    },
                ]
            },
            {
                'key': 'name_2',
                'subCategories': []
            },
            {
                'key': 'name_3',
                'subCategories': []
            },
        ]

    },
    {
        'key': 'name',
        'subCategories': []
    }
]


задача - получить все имена key, самых последних subCategories, (т.е. if len(subCategories) == 0 return key )

Пробую реализовать таким способом
def get_names(list_dic):
    name = list_dic.get('name')
    subCats = list_dic.get('subCategories')
    if isinstance(subCats, list):
        for subCat in subCats:
            get_models(subCat)
    return name

for name in list_dic:
    print(get_names(name))


... но получаю только самые первые значения key.
Как это реализовать?
  • Вопрос задан
  • 168 просмотров
Решения вопроса 1
0xD34F
@0xD34F
def get_keys(arr):
  return sum((get_keys(sub) if len(sub := n['subCategories']) else [ n['key'] ] for n in arr), [])
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Если вложенность словаря неизвестна, то проще всего рекурсией.
def process_dict(d: dict):
    pass  # тут работаешь с этим словарём
    # рекурсивный вызов для вложенных словарей
    subresults = [process_dict(subdict) for subdict in d['subCategories']]
    pass # тут объединяешь результаты от вложенных словарей с основным результатом
    return ... # обязательно возвращаешь результат
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы