Весьма часто, данные, которые мы получаем из различных источников, не удовлетворяют нашим пожеланиям. Одна из частых проблем – излишняя вложенность списков.
Напишите функцию make_linear
, которая принимает список списков и возвращает его “выпрямленное” представление.
Примечание
Ваше решение должно содержать только функции.
В решении не должно быть вызовов требуемых функций, за исключением рекурсивных.
Трассировка вызова рекурсивной функции в обработке ответа не учитывается и показана для примера.
Пример
Ввод
result = make_linear([1, 2, [3]])
Вывод
# Вызов make_linear([1, 2, [3]])
# Вызов make_linear([3])
result = [1, 2, 3]
Ввод
result = make_linear([1, [2, [3, 4]], 5, 6])
Вывод
# Вызов make_linear([1, [2, [3, 4]], 5, 6])
# Вызов make_linear([2, [3, 4]])
# Вызов make_linear([3, 4])
result = [1, 2, 3, 4, 5, 6]
Решение
Прекрасный пример силы и красоты рекурсии. Разобравшись с этой задачей вы без труда сможете самостоятельно реализовать функцию копирования словарей.
Итак нам дан список, который в свою очередь в качестве элементов может содержать другие списки, которые, в свою очередь могут содержать списки и так до бесконечности. Так как мы не знаем максимальную глубину вложенности списков нам отлично подойдет рекурсия.
Суть проста – мы перебираем элементы списка и пока нам не попадается список просто добавляем элемент в новый список, который будет результатом выполнения нашей функции. Если нам попался список, то мы делаем рекурсивный вызов и расширяем наш список-результат тем, что вернет рекурсивный вызов. Глубина рекурсии будет равна максимальной вложенности списков, и таким образом мы будем либо добавлять элементы по одному, либо скопом, расширяя список после рекурсивного вызова.
Существует “читерский” способ решить эту задачу.
Достаточно преобразовать список в строку и удалить все символы ‘[‘ и ‘]’ после чего с помощью split() преобразовать получившуюся строку обратно в список.
Посмотреть код
Решение
def make_linear(lst):
result = []
for item in lst:
if isinstance(item, list):
result.extend(make_linear(item))
else:
result.append(item)
return result