J. “Выпрямление” списка

Весьма часто, данные, которые мы получаем из различных источников, не удовлетворяют нашим пожеланиям. Одна из частых проблем – излишняя вложенность списков.

Напишите функцию 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() преобразовать получившуюся строку обратно в список.

Посмотреть код

Решение

Python
def make_linear(lst):
    result = []
    for item in lst:
        if isinstance(item, list):
            result.extend(make_linear(item))
        else:
            result.append(item)
    return result
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии