Обходите вложенные словари, соединяя компоненты пути выбранным разделителем. Заранее определите обработку пустых словарей и коллизий ключей.
Выравнивание глубоко вложенного словаря в отображение одного уровня
Обходите вложенные словари, соединяя компоненты пути выбранным разделителем. Заранее определите обработку пустых словарей и коллизий ключей.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте функцию, принимающую на вход словарь произвольной глубины вложенности и возвращающую набор пар «ключ‑значение», где каждый ключ сформирован путём объединения всех родительских ключей.
Пример входных данных: {'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. Предполагается ациклическая структура.