Преобразование вложенного списка в плоский
В этом примере посмотрим, как из вложенного списка сделать плоский (одномерный). Покажем пять способов — от самого компактного через генератор списков до варианта через reduce() и lambda.
Что нужно знать
Перед изучением примера полезно понимать:
Python: цикл for — цикл
forPython: список (list) — списки
Пример 1. Через генератор списка
my_list = [[1], [2, 3], [4, 5, 6, 7]]
flat_list = [num for sublist in my_list for num in sublist]
print(flat_list)
Вывод
[1, 2, 3, 4, 5, 6, 7]
Это самый «питонический» вариант разворачивания вложенного списка.
Через генератор списка проходим по каждому вложенному списку
sublistвнутриmy_list, а затем по каждому элементуnum.Все
numсобираются в новый списокflat_list.
Подробнее о такой записи смотри в Python: list comprehension.
Пример 2. Через вложенные циклы for
my_list = [[1], [2, 3], [4, 5, 6, 7]]
flat_list = []
for sublist in my_list:
for num in sublist:
flat_list.append(num)
print(flat_list)
Вывод
[1, 2, 3, 4, 5, 6, 7]
Создаём пустой список
flat_list.С помощью вложенного цикла
forдостаём каждый элемент вложенного списка и добавляем его вflat_listчерезappend().
Пример 3. Через модуль itertools
import itertools
my_list = [[1], [2, 3], [4, 5, 6, 7]]
flat_list = list(itertools.chain(*my_list))
print(flat_list)
Вывод
[1, 2, 3, 4, 5, 6, 7]
Модуль itertools тоже позволяет получить плоский список.
Функция
chain()изitertoolsвозвращает по очереди элементы каждого переданного итерируемого объекта (то есть каждого вложенного списка).list()упаковывает эти элементы обратно в список.
Пример 4. Через sum()
my_list = [[1], [2, 3], [4, 5, 6, 7]]
flat_list = sum(my_list, [])
print(flat_list)
Вывод
[1, 2, 3, 4, 5, 6, 7]
В
sum()передаём два аргумента: самmy_listи пустой список[].sum()последовательно «складывает» все вложенные списки с пустым, получается одномерный список.
Пример 5. Через lambda и reduce()
from functools import reduce
my_list = [[1], [2, 3], [4, 5, 6, 7]]
print(reduce(lambda x, y: x+y, my_list))
Вывод
[1, 2, 3, 4, 5, 6, 7]
Здесь reduce() применяет lambda-функцию ко всем элементам my_list подряд: сначала к первым двум, потом к результату и следующему, и так далее. Так как + для списков — это конкатенация, на выходе получаем один общий список.
Подробнее о lambda-функциях смотри в Лямбда-функция (анонимная функция) в Python.