Объединение списков в один в Python: без циклов и быстро
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для слияния списка списков пользуйтесь инструментом itertools.chain()
:
from itertools import chain
flattened_list = list(chain.from_iterable(list_of_lists))
Или используйте краткий генератор списков:
flattened_list = [item for sublist in list_of_lists for item in sublist]
Результат: [1, 2, 3, 4, 5, 6]
.
Выбор метода: Обзор вариантов
itertools: Мгновенная эффективность
itertools.chain.from_iterable
создан для таких ситуаций. Он генерирует единый итератор, что экономит память и повышает скорость обработки:
from itertools import chain
flattened_list = list(chain.from_iterable(list_of_lists))
Метод преимущественен, т.к. не требует лишних итераций и временных списков, что делает его оптимальным в плане производительности.
Sum: Безхитростный прием с оговорками
Функция sum()
с пустым списком в роли начального значения также решает эту задачу:
flattened_list = sum(list_of_lists, [])
Однако при обработке больших объемов такой подход может замедлиться из-за частого создания временных списков – так называемого эффекта 'алгоритма Шлемиля-художника'.
Собственная функция: Универсальный вариант
Рекурсивная функция flatten эффективна с списками и кортежами и успешно справляется с контейнерами различной глубины и структуры:
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()
прекрасно подходит для небольших объемов данных, но при масштабировании надо учитывать память. В таких случаях стоит использовать генераторные выражения:
flattened_list = (item for sublist in list_of_lists for item in sublist)
Такой подход предоставляет контроль над использованием памяти, не создавая при этом списков.
Сочетание map и extend
Можно соединить extend() с map()
, что избавит от необходимости писать циклы вручную:
flattened_list = sum(map(lambda lst: lst[:], list_of_lists), [])
Такой метод объединения срезов и функции sum
может показаться сложным, но он весьма эффективен.
Гибкость работы с вложенными структурами
Функция flatten умеет работать не только со списками, но и с кортежами и другими итерабельными объектами, гарантируя сохранение типов входных данных.
Визуализация
Визуализируйте уплощение списка списков в Python как колоду карт (🃏):
Исходные подсписки – это 'руки' в игре:
Рука 1: [🂠, 🂡, 🂢, 🂣]
Рука 2: [🃠, 🃡, 🃢, 🃣]
Рука 3: [🄠, 🄡, 🄢, 🄣]
Объединение их – это будто собрать эти руки в одну колоду:
Упорядоченная колода: [🂠, 🂡, 🂢, 🂣, 🃠, 🃡, 🃢, 🃣, 🄠, 🄡, 🄢, 🄣]
Каждый подсписок достает карты, формируя общую колоду для удобства просмотра. 🃏✨
Советы от python-разработчика
Приоритетом является – понятность кода
Даже если кажется, что короткий код лучше, следуйте мандату Python: Читаемость важна. Стремитесь к простоте.
Осмысленное преобразование
Не следует уплощать списки без необходимости. В ряде случаев вложенность носит смысловую нагрузку, как в случае представления матричных данных.
Блоки try-except
Они незаменимы, когда нельзя быть уверенным в однородности данных или когда возникает риск столкнуться с неитерируемыми элементами.
Полезные материалы
- itertools — создание итераторов для эффективного перебора — Документация Python 3.12.1 — официальная документация Python по
itertools.chain
. - python – Как получить плоский список из списка списков? – Stack Overflow — подробное обсуждение на Stack Overflow о преобразовании списков.
- Использование генераторов списков в Python – Real Python — руководство по работе с генераторами списков в Python.
- объединение списка списков в python – Stack Overflow — обсуждение на Stack Overflow о том, как объединить списки.
- Официальное руководство по структурам данных в Python — пособие с данными об операциях со списками.
- GeeksforGeeks – Как уплощать 2D списки — подробное руководство об способах преобразования 2D списков в Python.