Преобразование вложенного списка в плоский

В этом примере посмотрим, как из вложенного списка сделать плоский (одномерный). Покажем пять способов — от самого компактного через генератор списков до варианта через reduce() и lambda.

Что нужно знать

Перед изучением примера полезно понимать:

Пример 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.