Расширить функцию flatten для обработки вложенных list и tuple

Проверяйте оба типа, list и tuple, и уберите общий изменяемый result по умолчанию. Для большой глубины используйте явный стек итераторов вместо рекурсии.

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

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

Проверяйте оба типа, list и tuple, и уберите общий изменяемый result по умолчанию. Для большой глубины используйте явный стек итераторов вместо рекурсии.

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

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

Условие

Необходимо улучшить функцию flat, чтобы она рекурсивно разворачивала любые вложенные списки и кортежи, собирая все элементы в единственный одномерный список.

mylist = [[1, 2, [3, [4, (5, (5.5, [5.8]))]]], 6, 7, 8]

def flat(arr, result=[]):
    for a in arr:
        if not isinstance(a, list):
            result.append(a)
        else:
            flat(a, result)
    return result

После доработки функция должна корректно обрабатывать как списки, так и кортежи, независимо от глубины вложения, и возвращать плоский список всех найденных элементов.

Ответ

Проверяйте оба типа, list и tuple, и уберите общий изменяемый result по умолчанию. Для большой глубины используйте явный стек итераторов вместо рекурсии.

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

Результат примера: [1, 2, 3, 4, 5, 5.5, 5.8, 6, 7, 8]. Порядок сохраняется, строки считаются целыми элементами. Нет ограничения глубины Python-рекурсии, но память всё равно ограничена ресурсами. Предполагается ациклическая структура: самоссылочные списки требуют отдельного обнаружения циклов.

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

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

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

Подробнее