Опубликован: 08.09.2023 123
Python предоставляет много различных способов решения задачи сглаживания (выравнивания) 2D списков (т.е. преобразования вложенных списков к простому одномерному списку).
Большинство из таких способов используют либо цикл for
, либо внешние библиотеки Python и требуют написания программы из нескольких строк кода.
Но есть один очень простой и эффективный трюк, позволяющий решить эту задачу буквально в одну строку с помощью стандартной функции sum()
.
my_list = [[1, 2, 3], [4, 5], [6], [7, 8, 9]]
print( sum( my_list, [] ) )
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Функция sum()
вычисляет сумму всех элементов последовательности, которая в данном случае представлена списком списков.
Стандартный синтаксис: sum( iterable, start=0 )
(где: iterable - итерируемый объект, start - начальное значение для суммы, необязательный параметр).
Если вторым параметром в качестве начального значения суммы указать квадратные скобки []
, то возвращаемый тип данных будет относится к списку.
Этот метод используется для сглаживания (выравнивания) вложенных списков в Python (но только с одним уровнем вложенности).
chain.from_iterable()
модуля itertools
.Еще один часто используемый способ решения этой задачи - сглаживание вложенных списков с помощью функции chain.from_iterable()
встроенного модуля itertools
.
Синтаксис: itertools.chain.from_iterable( iterable )
iterable
- итерируемый объект с вложенными последовательностями.Функция chain.from_iterable()
получает в качестве аргумента итерируемую последовательность iterable
с вложенными последовательности и возвращает итератор, в котором вложенные последовательности объединены в одну распакованную последовательность.
Но такой метод позволяет сглаживать только списки списков с одним уровнем вложенности!
from itertools import chain
my_list = [[1, 2, 3], [4, 5], [6], [7, 8, 9]]
list(chain.from_iterable(my_list))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Одним из самых распространенных способов решения этой задачи является использование рекурсии (когда функция вызывает саму себя непосредственно или косвенно).
Пример использования рекурсии для преобразования вложенного списка с любым уровнем вложенности в плоский список:
# рекурсивная функция для сглаживания вложенных списков
def flatten(lst):
result = []
for i in lst:
if isinstance(i, list):
result.extend(flatten(i))
else:
result.append(i)
return result
lst = [[[11, 12, 13], [14, 15, 16], [17, 17, 19]], [[21, 22, 23], [24, 25, 26], [27, 27, 29]], [[31, 32, 33], [34, 35, 36], [37, 37, 39]]]
flatten_lst = flatten(lst)
print(flatten_lst)
[11, 12, 13, 14, 15, 16, 17, 17, 19, 21, 22, 23, 24, 25, 26, 27, 27, 29, 31, 32, 33, 34, 35, 36, 37, 37, 39]
Методы преобразования списка в строку и обратно
Фильтрация элементов итератора с помощью bool-списка функции itertools.compress()
Пропуск не нужных элементов последовательности с помощью itertools.dropwhile()
Комментариев нет.