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


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

Пример:

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

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

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

1595


источник


Ответы:


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

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

mergedlist = listone + listtwo

Вывод:

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

2630



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

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

209



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

mergedlist = list(set(listone + listtwo))

151



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

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

97



питон >= 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из-за несоответствия типов:

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

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

res = [*l, *r]

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


89



This is quite simple, I think it was even shown in the tutorial:

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

56



You could simply use the + or += operator as follows:

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

c = a + b

Or:

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

c += (a + b)

Also, if you want the values in the merged list to be unique you can do:

c = list(set(a + b))

33



This question directly asks about joining two lists. However it's pretty high in search even when you are looking for a way of joining many lists (including the case when you joining zero lists). Consider this more generic approach:

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

Will output:

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

Note, this also works correctly when a is [] or [[1,2,3]].

However, this can be done more efficiently with itertools:

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

If you don't need a list, but just an iterable, omit list().

Update

Alternative suggested by Patrick Collins in the comments could also work for you:

sum(a, [])

28



It's worth noting that the itertools.chain function accepts variable number of arguments:

>>> 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']

If an iterable (tuple, list, generator, etc.) is the input, the from_iterable class method may be used:

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

20



With Python 3.3+ you can use yield from:

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]

Or, if you want to support an arbitrary number of iterators:

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]

19