Обходите вложенные списки с явным стеком итераторов, добавляя обычные элементы в результат. Это сохраняет порядок и не зависит от лимита рекурсии 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 при необходимости добавляется в проверку типа. Самоссылочный список приведёт к бесконечному обходу, поэтому предполагается конечная ациклическая структура.