Выравнивание глубоко вложенного словаря в отображение одного уровня

Обходите вложенные словари, соединяя компоненты пути выбранным разделителем. Заранее определите обработку пустых словарей и коллизий ключей.

Короткий ответ

Что ответить на собеседовании

Обходите вложенные словари, соединяя компоненты пути выбранным разделителем. Заранее определите обработку пустых словарей и коллизий ключей.

Подробный разбор

Ответ с пояснениями

Условие

Создайте функцию, принимающую на вход словарь произвольной глубины вложенности и возвращающую набор пар «ключ‑значение», где каждый ключ сформирован путём объединения всех родительских ключей.

Пример входных данных: {'a': 4, 'b': {'x': 3}, 'c': {'d': 5, 'e': {'f': 2}}, 'g': 'y'}

Ответ

Обходите вложенные словари, соединяя компоненты пути выбранным разделителем. Заранее определите обработку пустых словарей и коллизий ключей.

def flatten_dict(data):
    result = {}
    stack = [((), data)]
    while stack:
        prefix, current = stack.pop()
        for key, value in current.items():
            if not isinstance(key, str) or '.' in key:
                raise ValueError('Нужны строковые ключи без точки')
            path = prefix + (key,)
            if isinstance(value, dict) and value:
                stack.append((path, value))
            else:
                result['.'.join(path)] = value
    return result

Для примера ключи: a, b.x, c.d, c.e.f, g. Пустой вложенный словарь здесь сохраняется как значение. Порядок результата не задан. Запрет точки предотвращает неоднозначность между исходным ключом a.b и вложенностью a → b. Предполагается ациклическая структура.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее