Глубокая рекурсивная распаковка аргументов

Разворачивайте list, tuple, set и frozenset, пропускайте dict, а строки считайте целыми значениями. Явный стек убирает ограничение глубины рекурсивных вызовов.

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

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

Разворачивайте list, tuple, set и frozenset, пропускайте dict, а строки считайте целыми значениями. Явный стек убирает ограничение глубины рекурсивных вызовов.

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

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

Условие

Необходимо написать функцию flatten, принимающую произвольное количество параметров разных типов и преобразующую их в одну плоскую последовательность. При этом словари (dict) должны игнорироваться, а вложенные структуры могут иметь любую глубину.

flatten(1, 2, [3, 4, [5, 0], 7], 8, ('A', {'B', 'C'}))
# → 1 2 3 4 5 0 7 8 'A' 'B' 'C' (элементы из set могут идти в произвольном порядке)

Ответ

Разворачивайте list, tuple, set и frozenset, пропускайте dict, а строки считайте целыми значениями. Явный стек убирает ограничение глубины рекурсивных вызовов.

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

Порядок списков и кортежей сохраняется, у множества порядок не гарантируется. Словарь пропускается целиком, включая значения. Это явно заданный набор контейнеров: попытка разворачивать любой iterable без исключений раздробила бы строки. Циклические структуры требуют отдельной защиты; пример предполагает конечный ациклический вход.

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

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

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

Подробнее