Как объединить два списка в Python?
Пример:
listone = [1, 2, 3]
listtwo = [4, 5, 6]
Ожидаемый результат:
>>> joinedlist
[1, 2, 3, 4, 5, 6]
python
list
concatenation
2000 год
источник
источник
[1,2,5] and [2,4,5,6]
? Вы хотите, чтобы дубликаты были включены, исключены или не заботились?Ответы:
Вы можете использовать
+
оператор, чтобы объединить их:Вывод:
источник
listone += listtwo
результатыlistone == [1, 2, 3, 4, 5, 6]
list3 = listone
listone+=listtwo
список3 тоже изменился?Также возможно создать генератор, который просто перебирает элементы в обоих списках, используя
itertools.chain()
. Это позволяет объединять списки (или любые итерируемые) для обработки без копирования элементов в новый список:источник
chain
находится на более медленной стороне (но не намного) для двух списков, но является самым быстрым решением для объединения нескольких списков (n >> 2).>= 3.5
Альтернатива Python :[*l1, *l2]
Еще одна альтернатива была введена путем принятия
PEP 448
которое заслуживает упоминания.PEP, озаглавленный « Дополнительные обобщения распаковки» , обычно уменьшает некоторые синтаксические ограничения при использовании звездного
*
выражения в Python; с его помощью объединение двух списков (применимо к любому итерируемому) теперь также можно сделать с помощью:Эта функциональность была определена для Python,
3.5
она не была перенесена в предыдущие версии3.x
семейства. В неподдерживаемых версияхSyntaxError
будет поднят.Как и в случае с другими подходами, это также создает мелкую копию элементов в соответствующих списках.
Перевернутое этот подход заключается в том , что вы действительно не нужно списках для того , чтобы выполнить это, все , что итератор будет делать. Как указано в ОПТОСОЗ:
Таким образом, в то время как сложение с
+
вызоветTypeError
несоответствие типов:Следующее не будет:
потому что он сначала распакует содержимое итерируемых элементов, а затем просто создаст
list
из содержимого.источник
res = [*l1, *reversed(l2)]
. Так какreversed
возвращает итератор,res = l1 + reversed(l2)
выдаст ошибку.Вы можете использовать наборы для получения объединенного списка уникальных значений
источник
listone + [x for x in listtwo if x not in listone]
import collections; mergedlist = list(collections.OrderedDict.fromkeys(listone + listtwo))
добьетесь цели.Вы также можете использовать
list.extend()
метод для добавления alist
в конец другого:Если вы хотите сохранить исходный список без изменений, вы можете создать новый
list
объект, иextend
оба списка к нему:источник
Начиная с версии 3.7, это самые популярные методы stdlib для объединения двух (или более) списков в python.
Представление
Объединение двух списков 1
Между этими методами нет большой разницы, но это имеет смысл, учитывая, что все они имеют одинаковый порядок сложности (линейный). Нет особой причины предпочитать одно другому, кроме как из-за стиля.
Конкатенация N-List
Графики были созданы с использованием модуля perfplot . Код, для вашей справки.
1. Методы
iadd
(+=
) иextend
работают на месте, поэтому каждый раз перед тестированием необходимо генерировать копию. Чтобы быть справедливым, у всех методов есть шаг перед копированием для левого списка, который можно игнорировать.Комментарии к другим решениям
НЕ ИСПОЛЬЗУЙТЕ МЕТОД DUNDER
list.__add__
напрямую, в любом виде, форме или форме. На самом деле, держитесь подальше от более сложных методов и используйте операторы иoperator
функции, для которых они предназначены. Python имеет тщательно продуманную семантику, которая сложнее, чем просто вызов dunder напрямую. Вот пример . Итак, подведем итог,a.__add__(b)
=> ПЛОХО;a + b
=> ХОРОШО.Некоторые ответы здесь предлагают
reduce(operator.add, [a, b])
для парной конкатенации - это то же самое, чтоsum([a, b], [])
только более многословно.Любой метод, который использует
set
, удалит дубликаты и потеряет порядок. Используйте с осторожностью.for i in b: a.append(i)
более многословно и медленнее, чемa.extend(b)
одиночный вызов функции и более идиоматично.append
медленнее из-за семантики, с которой память выделяется и увеличивается для списков. Смотрите здесь для аналогичного обсуждения.heapq.merge
будет работать, но его вариант использования для объединения отсортированных списков в линейное время. Использование его в любой другой ситуации - это анти-паттерн.yield
Получение списка элементов из функции является приемлемым методом, ноchain
делает это быстрее и лучше (у него есть путь к коду в C, поэтому он быстрый).operator.add(a, b)
является приемлемым функциональным эквивалентомa + b
. Это варианты использования в основном для динамической отправки метода. Иначе предпочитаюa + b
что короче и более читабельно, на мой взгляд . YMMV.источник
"There's not much difference between these methods but that makes sense given they all have the same order of complexity (linear). There's no particular reason to prefer one over the other except as a matter of style.
«Решения, не указанные в моем ответе или критикуемые в« Комментариях », рекомендую не использовать.Это довольно просто, и я думаю, что это было даже показано в уроке :
источник
Этот вопрос напрямую задает вопрос о соединении двух списков. Тем не менее, поиск довольно высок, даже если вы ищете способ объединения многих списков (включая случай, когда вы присоединяетесь к нулевым спискам).
Я думаю, что лучше всего использовать списочные выражения:
Вы также можете создавать генераторы:
Старый ответ
Рассмотрим этот более общий подход:
Будет выводить:
Обратите внимание, это также работает правильно, когда
a
есть[]
или[[1,2,3]]
.Тем не менее, это может быть сделано более эффективно с
itertools
:Если вам не нужен
list
, а просто повторяется, опуститеlist()
.Обновить
Альтернатива, предложенная Патриком Коллинзом в комментариях, также может сработать для вас:
источник
reduce
теперь вfunctools
наличии, поэтому сначала вам нужно его импортировать.Вы можете просто использовать оператор
+
or+=
следующим образом:Или:
Кроме того, если вы хотите, чтобы значения в объединенном списке были уникальными, вы можете сделать следующее:
источник
list(dict.fromkeys(a + b))
Стоит отметить, что
itertools.chain
функция принимает переменное количество аргументов:Если в качестве входных данных используется итерация (кортеж, список, генератор и т. Д.),
from_iterable
Можно использовать метод класса:источник
С Python 3.3+ вы можете использовать yield из :
Или, если вы хотите поддерживать произвольное количество итераторов:
источник
itertools.chain
(что эквивалентно) вместо определения своей собственной функции.Если вы хотите объединить два списка в отсортированном виде, вы можете использовать
merge
функцию изheapq
библиотеки.источник
Если вы не можете использовать оператор плюс (
+
), вы можете использоватьoperator
импорт:Кроме того, вы также можете использовать функцию
__add__
Dunder :источник
+
со стола, используйтеoperator.add
.В качестве более общего способа для большего количества списков вы можете поместить их в список и использовать функцию
itertools.chain.from_iterable()
1, которая на основе этого ответа является лучшим способом выравнивания вложенного списка:1. Обратите внимание, что
chain.from_iterable()
доступно в Python 2.6 и более поздних версиях. В других версиях используйтеchain(*l)
.источник
Если вам нужно объединить два упорядоченных списка со сложными правилами сортировки, вам, возможно, придется свернуть его самостоятельно, как показано в следующем коде (используя простое правило сортировки для удобства чтения :-)).
источник
heapq.merge
.Вы можете использовать
append()
метод, определенный дляlist
объектов:источник
Приведенный выше код не сохраняет порядок, удаляет дубликаты из каждого списка (но не из объединенного списка)
источник
Как уже указывалось многими,
itertools.chain()
это путь, если нужно применить одинаковый режим к обоим спискам. В моем случае у меня был ярлык и флаг, которые отличались от одного списка к другому, поэтому мне нужно было что-то немного более сложное. Как выясняется, за кадромitertools.chain()
просто делает следующее:(см. https://docs.python.org/2/library/itertools.html ), поэтому я черпал вдохновение и написал что-то вроде этого:
Здесь необходимо понять, что списки - это просто частный случай итерации, которые являются объектами, подобными любым другим; и что
for ... in
циклы в python могут работать с переменными кортежей, поэтому можно легко зацикливать несколько переменных одновременно.источник
Используйте простое понимание списка:
Он обладает всеми преимуществами новейшего подхода использования дополнительных распаковывающих обобщений - т.е. вы можете объединить произвольное количество различных итераций (например, списков, кортежей, диапазонов и генераторов) таким образом - и он не ограничен Python 3.5 или новее ,
источник
Действительно краткий способ объединить список списков
что дает нам
источник
list.__add__
, используйтеoperator.add
вместо этого. Это более многословный эквивалент,sum(list_of_lists, [])
который так же плох. НЕ ИСПОЛЬЗУЙТЕ!obj.__class__
иobj.__dict__
.В Python вы можете объединить два массива совместимых измерений с помощью этой команды
источник
Итак, есть два простых способа.
+
: создает новый список из предоставленных списковПример:
Пример:
Таким образом, мы видим, что из двух самых популярных методов
extend
эффективен.источник
chain.from_iterable
).Есть несколько способов конкатенировать списки в Python.
источник
Вывод:
источник
Если вам нужен новый список с сохранением двух старых списков:
источник
источник
Вы можете следовать за кодом
источник