Как объединить два списка в Python?

Как объединить два списка в Python?

Пример:

listone = [1, 2, 3]
listtwo = [4, 5, 6]

Ожидаемый результат:

>>> joinedlist
[1, 2, 3, 4, 5, 6]

Ответы

Ответ 1

Вы можете использовать оператор + чтобы объединить их:

listone = [1,2,3]
listtwo = [4,5,6]

joinedlist = listone + listtwo

Выход:

>>> joinedlist
[1,2,3,4,5,6]

Ответ 2

Также возможно создать генератор, который просто перебирает элементы в обоих списках. Это позволяет объединять списки (или любые итерируемые) для обработки без копирования элементов в новый список:

import itertools
for item in itertools.chain(listone, listtwo):
   # Do something with each list item

Ответ 3

Вы можете использовать наборы для получения объединенного списка уникальных значений

mergedlist = list(set(listone + listtwo))

Ответ 4

Python >= 3.5 альтернатива: [*l1, *l2]

Несмотря на то, что это старый ответ, другая альтернатива была введена посредством принятия PEP 448 который заслуживает упоминания.

PEP под названием " Дополнительные распаковывающие обобщения", как правило, уменьшал некоторые синтаксические ограничения при использовании выделенного * выражения в Python; вместе с ним объединение двух списков (применимо к любому итерабельному) теперь также можно выполнить с помощью:

>>> l1 = [1, 2, 3]
>>> l2 = [4, 5, 6]

#unpack both iterables in a list literal
>>> joinedList = [*l1, *l2]
>>> print(joinedList)
[1, 2, 3, 4, 5, 6]

Эта функциональность была определена для Python 3.5 она не была обращена к предыдущим версиям в семействе 3.x В неподдерживаемых версиях SyntaxError будет поднят.

Как и в случае с другими подходами, это также создает неглубокую копию элементов в соответствующих списках.


Достоинством такого подхода является то, что вы на самом деле не нужны списки для того, чтобы выполнить его, ничего, что итератор будет делать. Как указано в ОПТОСОЗ:

Это также полезно как более читаемый способ суммирования итераций в список, такой как my_list + list(my_tuple) + list(my_range) который теперь эквивалентен только [*my_list, *my_tuple, *my_range].

Таким образом, в то время как добавление с + TypeError бы TypeError из-за несоответствия типа:

l = [1, 2, 3]
r = range(4, 7)
res = l + r

Ниже не будет:

res = [*l, *r]

потому что он сначала распакует содержимое итераций, а затем просто создаст list из содержимого.

Ответ 5

Вы также можете использовать extend, чтобы добавить list в конец другого:

listone = [1,2,3]
listtwo = [4,5,6]
mergedlist = []
mergedlist.extend(listone)
mergedlist.extend(listtwo)

Ответ 6

Это довольно просто, и я думаю, что это было даже показано в уроке:

>>> listone = [1,2,3]
>>> listtwo = [4,5,6]
>>>
>>> listone + listtwo
[1, 2, 3, 4, 5, 6]

Ответ 7

Этот вопрос непосредственно задает вопрос о присоединении к двум спискам. Однако он довольно высок в поиске, даже если вы ищете способ объединения многих списков (включая случай, когда вы присоединяетесь к нулевым спискам).

Я считаю, что лучшим вариантом является использование списков:

>>> a = [[1,2,3], [4,5,6], [7,8,9]]
>>> [x for xs in a for x in xs]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

Вы также можете создавать генераторы:

>>> map(str, (x for xs in a for x in xs))
['1', '2', '3', '4', '5', '6', '7', '8', '9']

Старый ответ

Рассмотрим этот более общий подход:

a = [[1,2,3], [4,5,6], [7,8,9]]
reduce(lambda c, x: c + x, a, [])

Вывод:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

Обратите внимание, что это также работает правильно, когда a является [] или [[1,2,3]].

Однако это можно сделать более эффективно с помощью itertools:

a = [[1,2,3], [4,5,6], [7,8,9]]
list(itertools.chain(*a))

Если вам не нужен list, а просто итерабельный, опустите list().

Обновить

Альтернатива, предложенная Патриком Коллинзом в комментариях, может также работать на вас:

sum(a, [])

Ответ 8

Вы можете просто использовать оператор + или += следующим образом:

a = [1, 2, 3]
b = [4, 5, 6]

c = a + b

Или:

c = []
a = [1, 2, 3]
b = [4, 5, 6]

c += (a + b)

Кроме того, если вы хотите, чтобы значения в объединенном списке были уникальными, вы можете:

c = list(set(a + b))

Ответ 9

Стоит отметить, что функция itertools.chain принимает переменное количество аргументов:

>>> l1 = ['a']; l2 = ['b', 'c']; l3 = ['d', 'e', 'f']
>>> [i for i in itertools.chain(l1, l2)]
['a', 'b', 'c']
>>> [i for i in itertools.chain(l1, l2, l3)]
['a', 'b', 'c', 'd', 'e', 'f']

Если итерабельным (кортеж, список, генератор и т.д.) является ввод, может использоваться метод класса from_iterable:

>>> il = [['a'], ['b', 'c'], ['d', 'e', 'f']]
>>> [i for i in itertools.chain.from_iterable(il)]
['a', 'b', 'c', 'd', 'e', 'f']

Ответ 10

С Python 3.3+ вы можете использовать доход от:

listone = [1,2,3]
listtwo = [4,5,6]

def merge(l1, l2):
    yield from l1
    yield from l2

>>> list(merge(listone, listtwo))
[1, 2, 3, 4, 5, 6]

Или, если вы хотите поддерживать произвольное число итераторов:

def merge(*iters):
    for it in iters:
        yield from it

>>> list(merge(listone, listtwo, 'abcd', [20, 21, 22]))
[1, 2, 3, 4, 5, 6, 'a', 'b', 'c', 'd', 20, 21, 22]

Ответ 11

Вы можете перейти к функции list.extend.

l1 = [1,2,3]
l2 = [4,5,6]
l1.extend(l2)
print l1

Вывод:

[1,2,3,4,5,6]

Ответ 12

Если вы хотите объединить два списка в отсортированном виде, вы можете использовать функцию merge из библиотеки heapq.

from heapq import merge

a = [1, 2, 4]
b = [2, 4, 6, 7]

print list(merge(a, b))

Ответ 13

Если вы не можете использовать оператор плюс (+), вы можете использовать operator импорта:

import operator

listone = [1,2,3]
listtwo = [4,5,6]

result = operator.add(listone, listtwo)
print(result)

>>> [1, 2, 3, 4, 5, 6]

В качестве альтернативы вы также можете использовать функцию __add__ dunder:

listone = [1,2,3]
listtwo = [4,5,6]

result = list.__add__(listone, listtwo)
print(result)

>>> [1, 2, 3, 4, 5, 6]

Ответ 14

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

>>> l=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> import itertools
>>> list(itertools.chain.from_iterable(l))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

1. Обратите внимание, что chain.from_iterable() доступен в Python 2.6 и более поздних версиях.В других версиях используйте chain(*l).

Ответ 15

Если вам нужно объединить два упорядоченных списка со сложными правилами сортировки, вам, возможно, придется его катить, как в следующем коде (используя простое правило сортировки для чтения:-)).

list1 = [1,2,5]
list2 = [2,3,4]
newlist = []

while list1 and list2:
    if list1[0] == list2[0]:
        newlist.append(list1.pop(0))
        list2.pop(0)
    elif list1[0] < list2[0]:
        newlist.append(list1.pop(0))
    else:
        newlist.append(list2.pop(0))

if list1:
    newlist.extend(list1)
if list2:
    newlist.extend(list2)

assert(newlist == [1, 2, 3, 4, 5])

Ответ 16

Объединение двух списков в Python:

>>> a = [1, 2, 3, 4]
>>> b = [1, 4, 6, 7]
>>> c = a + b
>>> c
[1, 2, 3, 4, 1, 4, 6, 7]

Если вы не хотите дублирования:

>>> a = [1, 2, 3, 4, 5, 6]
>>> b = [5, 6, 7, 8]
>>> c = list(set(a + b))
>>> c
[1, 2, 3, 4, 5, 6, 7, 8]

Ответ 17

Вы можете использовать метод append(), определенный на объектах list:

mergedlist =[]
for elem in listone:
    mergedlist.append(elem)
for elem in listtwo:
    mergedlist.append(elem)

Ответ 18

Как уже отмечалось многими, itertools.chain() - это путь, если нужно применять одинаковое обращение к обоим спискам. В моем случае у меня был ярлык и флаг, который отличался от одного списка к другому, поэтому мне было нужно что-то более сложное. Как оказалось, за кулисами itertools.chain() просто выполняется следующее:

for it in iterables:
    for element in it:
        yield element

(см. https://docs.python.org/2/library/itertools.html), поэтому я получил вдохновение отсюда и написал что-то в этих строках:

for iterable, header, flag in ( (newList, 'New', ''), (modList, 'Modified', '-f')):
    print header + ':'
    for path in iterable:
        [...]
        command = 'cp -r' if os.path.isdir(srcPath) else 'cp'
        print >> SCRIPT , command, flag, srcPath, mergedDirPath
        [...]

Основные моменты, которые следует понимать здесь, - это список только случайных итераций, которые являются объектами, как и любые другие; и что for ... in петли в python могут работать с переменными кортежа, поэтому просто петля на нескольких переменных одновременно.

Ответ 19

list(set(listone) | set(listtwo))

Вышеприведенный код не сохраняет порядок, удаляет дубликат из каждого списка (но не из конкатенированного списка)

Ответ 20

Чтобы расширить список другим, есть несколько методов, как показано ниже:

>>> listone = [1,2,3]
>>> listome = [4,5,6]
>>>
>>> listone+listome # adding 2 list is actually extending the list
[1, 2, 3, 4, 5, 6]
>>>
>>> listone.extend(listome)
>>> listone
[1, 2, 3, 4, 5, 6]
>>>
>>> listone = [1,2,3]
>>>
>>> listone.__add__(listome)
[1, 2, 3, 4, 5, 6]

Также for loop также можно использовать:

>>> for i in listome:
...     listone.append(i)
...
>>> listone
[1, 2, 3, 4, 5, 6]
>>>

Ответ 21

list1 = [1,2,3]
list2 = [4,5,6]

joinedlist = list1 + list2
#Output : [1, 2, 3, 4, 5, 6]

Да, это так просто.

list1 + list2. Это дает новый список, который является конкатенацией list1 и list2.

Ответ 22

Очень сжатый способ комбинировать список списков

list_of_lists = [[1,2,3], [4,5,6], [7,8,9]]
reduce(list.__add__, list_of_lists)

который дает нам

[1, 2, 3, 4, 5, 6, 7, 8, 9]

Ответ 23

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

joined_list = [item for list_ in [list_one, list_two] for item in list_]

Он обладает всеми преимуществами новейшего подхода использования дополнительных распаковывающих обобщений - то есть вы можете объединить произвольное количество различных итераций (например, списков, кортежей, диапазонов и генераторов) таким образом - и он не ограничивается Python 3.5 или новее.,

Ответ 24

В Python вы можете объединить два массива совместимых измерений с помощью этой команды

numpy.concatenate([a,b])

Ответ 25

Как объединить два списка в Python?

Начиная с версии 3.7 это наиболее популярные методы stdlib для объединения двух (или более) списков в python.

enter image description here

Сноски

  1. Это ловкое решение из-за его краткости. Но sum выполняет конкатенацию попарно, что означает, что это квадратичная операция, поскольку память должна выделяться для каждого шага. НЕ ИСПОЛЬЗУЙТЕ, если ваши списки большие.

  2. Смотрите chain и chain.from_iterable из документов. import itertools вам нужно будет import itertools. Конкатенация линейна в памяти, поэтому она является лучшей с точки зрения производительности и совместимости версий. chain.from_iterable был введен в chain.from_iterable 2.6.

  3. Этот метод использует дополнительные обобщения распаковки (PEP 448), но не может обобщать до N списков, если вы сами не распаковываете вручную.

  4. a += b и a.extend(b) более или менее эквивалентны для всех практических целей. += при вызове по списку вызовет внутренний list.__iadd__, который расширяет первый список на второй.


Спектакль

Объединение двух списков 1

enter image description here

Конкатенация N-List

enter image description here

Графики были созданы с помощью модуля perfplot. Код, для вашей справки.

1. iadd (+=) и extend методы работают на месте, так что копия должна быть сгенерированы каждый раз перед тестированием.Чтобы быть справедливым, у всех методов есть шаг перед копированием для левого списка, который можно игнорировать.


Комментарии к другим решениям

  • НЕ ИСПОЛЬЗУЙТЕ list.__add__ DUNDER METHOD list.__add__ напрямую любым способом, в любой форме. На самом деле, держитесь подальше от более сложных методов и используйте операторы и operator функции, для которых они предназначены. Python имеет тщательно продуманную семантику, которая сложнее, чем просто вызов dunder напрямую. Вот пример. Итак, подведем итоги: a.__add__(b) => BAD; a + b => ХОРОШО.

  • В некоторых ответах здесь предложено reduce(operator.add, [a, b]) для парной конкатенации - это то же самое, что sum([a, b], []) только более многословная.

  • Любой метод, который использует set, удалит дубликаты и потеряет порядок. Используйте с осторожностью.

  • for я in b: a.append(i) является более многословным и более медленным, чем a.extend(b), который является одиночным вызовом функции и более идиоматическим. append медленнее из-за семантики, с которой память выделяется и увеличивается для списков. Смотрите здесь для аналогичного обсуждения.

  • heapq.merge будет работать, но его вариант использования предназначен для объединения отсортированных списков за линейное время. Использование его в любой другой ситуации - это анти-паттерн.

  • yield элементов списка из функции является приемлемым методом, но chain делает это быстрее и лучше (у него есть путь к коду в C, поэтому он быстрый).

  • operator.add(a, b) является приемлемым функциональным эквивалентом a + b. Это варианты использования в основном для динамической отправки метода. В противном случае, предпочтите a + b который, на мой взгляд, короче и более читабелен. YMMV.

Ответ 26

Вы можете использовать оператор "+" для объединения двух списков в Python:

>>> listone = [1,2,3]
>>> listtwo = [4,5,6]
>>>
>>> listSum = []
>>> listSum = listone + listtwo
>>> print(listSum)

   [1, 2, 3, 4, 5, 6]

Ответ 27

lst1 = [1,2]

lst2 = [3,4]

def list_combinationer(Bushisms, are_funny):

    for item in lst1:
        lst2.append(item)
        lst1n2 = sorted(lst2)
        print lst1n2

list_combinationer(lst1, lst2)

[1,2,3,4]

Ответ 28

Вы можете использовать функцию extends

listone.extends(listtwo)

Ответ 29

a = [1,2,3,4,5,6]
b = [7,8,9,10]
c = a.extend(b)

print (c) дает

[1,2,3,4,5,6,7,8,9,10]

Ответ 30

mergedlist=listone+listtwo

вы просто берете значения первого и второго и добавляете их к одной переменной. если я:

listone=[1,3,12]
listtwo=[32,32,1]

#merge the list
mergedlist=listone+listtwo 

print(mergedlist)

У меня будет:

[1,3,12,32,32,1]