Рекурсивное извлечение пар из словаря

33. Рекурсивное извлечение пар из словаря

Условие задачи: Написать функцию, которая принимает на вход словарь и возвращает список всех пар “ключ-значение”. Если значение является вложенным словарём, функция должна рекурсивно извлекать ключи и значения из этого словаря.

Пример:

data = {'a': 1, 'b': {'c': 2, 'd': {'e': 3}}, 'f': 4}
>>>[('a', 1), ('c', 2), ('e', 3), ('f', 4)]
Спойлеры к решению
Подсказки
  • Нужно пройтись по всем парам key, value словаря.
  • Если value является обычным значением, добавляем пару (key, value) в результат.
  • Если value является словарём, нужно рекурсивно обработать этот вложенный словарь.
  • Ключи, у которых значение является словарём, в результат не добавляются.
  • Для проверки типа можно использовать isinstance(value, dict).
Решение
def get_pairs(data: dict) -> list[tuple]:
    result = []

    for key, value in data.items():
        if isinstance(value, dict):
            result.extend(get_pairs(value))
        else:
            result.append((key, value))

    return result

Пример использования:

data = {
    "a": 1,
    "b": {
        "c": 2,
        "d": {
            "e": 3
        }
    },
    "f": 4
}

print(get_pairs(data))

Результат:

[('a', 1), ('c', 2), ('e', 3), ('f', 4)]

Функция проходит по словарю. Если значение является вложенным словарём, функция вызывает сама себя для этого словаря. Если значение не является словарём, пара (ключ, значение) добавляется в итоговый список.

Ключи "b" и "d" не попадают в результат, потому что они указывают на вложенные словари, а по условию нужно извлечь конечные пары ключ-значение.