Преобразование списка произвольной вложенности в плоскую форму

Обходите вложенные списки с явным стеком итераторов, добавляя обычные элементы в результат. Это сохраняет порядок и не зависит от лимита рекурсии Python.

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

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

Обходите вложенные списки с явным стеком итераторов, добавляя обычные элементы в результат. Это сохраняет порядок и не зависит от лимита рекурсии Python.

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

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

Условие

Реализуйте функцию, которая принимает список с неизвестным уровнем вложения и возвращает его как одномерный массив.

# [1, 2, 2, [23, 4, [3, 2]]] → [1, 2, 2, 23, 4, 3, 2]

Ответ

Обходите вложенные списки с явным стеком итераторов, добавляя обычные элементы в результат. Это сохраняет порядок и не зависит от лимита рекурсии Python.

def flatten(items):
    result = []
    stack = [iter(items)]
    while stack:
        try:
            item = next(stack[-1])
        except StopIteration:
            stack.pop()
            continue
        if isinstance(item, list):
            stack.append(iter(item))
        else:
            result.append(item)
    return result

Для примера результат [1, 2, 2, 23, 4, 3, 2]. Пустые вложенные списки пропускаются, повторяющиеся значения сохраняются. Код разворачивает только list; tuple при необходимости добавляется в проверку типа. Самоссылочный список приведёт к бесконечному обходу, поэтому предполагается конечная ациклическая структура.

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

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

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

Подробнее