logo

Объединение списков в один в Python: без циклов и быстро

Быстрый ответ

Для слияния списка списков пользуйтесь инструментом itertools.chain():

Python
Скопировать код
from itertools import chain
flattened_list = list(chain.from_iterable(list_of_lists))

Или используйте краткий генератор списков:

Python
Скопировать код
flattened_list = [item for sublist in list_of_lists for item in sublist]

Результат: [1, 2, 3, 4, 5, 6].

Выбор метода: Обзор вариантов

itertools: Мгновенная эффективность

itertools.chain.from_iterable создан для таких ситуаций. Он генерирует единый итератор, что экономит память и повышает скорость обработки:

Python
Скопировать код
from itertools import chain
flattened_list = list(chain.from_iterable(list_of_lists))

Метод преимущественен, т.к. не требует лишних итераций и временных списков, что делает его оптимальным в плане производительности.

Sum: Безхитростный прием с оговорками

Функция sum() с пустым списком в роли начального значения также решает эту задачу:

Python
Скопировать код
flattened_list = sum(list_of_lists, [])

Однако при обработке больших объемов такой подход может замедлиться из-за частого создания временных списков – так называемого эффекта 'алгоритма Шлемиля-художника'.

Собственная функция: Универсальный вариант

Рекурсивная функция flatten эффективна с списками и кортежами и успешно справляется с контейнерами различной глубины и структуры:

Python
Скопировать код
def flatten(container):
    for i in container:
        if isinstance(i, (list, tuple)):
            yield from flatten(i)
        else:
            yield i

flattened_list = list(flatten(list_of_lists))

Этот пример демонстрирует силу рекурсии в обработке сложных вложенных структур.

Когда и как выбирать инструмент

Работа с большими данными

itertools.chain() прекрасно подходит для небольших объемов данных, но при масштабировании надо учитывать память. В таких случаях стоит использовать генераторные выражения:

Python
Скопировать код
flattened_list = (item for sublist in list_of_lists for item in sublist)

Такой подход предоставляет контроль над использованием памяти, не создавая при этом списков.

Сочетание map и extend

Можно соединить extend() с map(), что избавит от необходимости писать циклы вручную:

Python
Скопировать код
flattened_list = sum(map(lambda lst: lst[:], list_of_lists), [])

Такой метод объединения срезов и функции sum может показаться сложным, но он весьма эффективен.

Гибкость работы с вложенными структурами

Функция flatten умеет работать не только со списками, но и с кортежами и другими итерабельными объектами, гарантируя сохранение типов входных данных.

Визуализация

Визуализируйте уплощение списка списков в Python как колоду карт (🃏):

Исходные подсписки – это 'руки' в игре:

Markdown
Скопировать код
Рука 1: [🂠, 🂡, 🂢, 🂣] 
Рука 2: [🃠, 🃡, 🃢, 🃣]
Рука 3: [🄠, 🄡, 🄢, 🄣]

Объединение их – это будто собрать эти руки в одну колоду:

Markdown
Скопировать код
Упорядоченная колода: [🂠, 🂡, 🂢, 🂣, 🃠, 🃡, 🃢, 🃣, 🄠, 🄡, 🄢, 🄣]

Каждый подсписок достает карты, формируя общую колоду для удобства просмотра. 🃏✨

Советы от python-разработчика

Приоритетом является – понятность кода

Даже если кажется, что короткий код лучше, следуйте мандату Python: Читаемость важна. Стремитесь к простоте.

Осмысленное преобразование

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

Блоки try-except

Они незаменимы, когда нельзя быть уверенным в однородности данных или когда возникает риск столкнуться с неитерируемыми элементами.

Полезные материалы

  1. itertools — создание итераторов для эффективного перебора — Документация Python 3.12.1официальная документация Python по itertools.chain.
  2. python – Как получить плоский список из списка списков? – Stack Overflow — подробное обсуждение на Stack Overflow о преобразовании списков.
  3. Использование генераторов списков в Python – Real Python — руководство по работе с генераторами списков в Python.
  4. объединение списка списков в python – Stack Overflowобсуждение на Stack Overflow о том, как объединить списки.
  5. Официальное руководство по структурам данных в Python — пособие с данными об операциях со списками.
  6. GeeksforGeeks – Как уплощать 2D списки — подробное руководство об способах преобразования 2D списков в Python.