Разворачивайте 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 без исключений раздробила бы строки. Циклические структуры требуют отдельной защиты; пример предполагает конечный ациклический вход.