Проверяйте оба типа, list и tuple, и уберите общий изменяемый result по умолчанию. Для большой глубины используйте явный стек итераторов вместо рекурсии.
Расширить функцию flatten для обработки вложенных list и tuple
Проверяйте оба типа, 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-рекурсии, но память всё равно ограничена ресурсами. Предполагается ациклическая структура: самоссылочные списки требуют отдельного обнаружения циклов.