Pregunta Cómo concatenar dos listas en Python?


¿Cómo concateno dos listas en Python?

Ejemplo:

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

Gastos esperados:

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

1637
2017-11-12 07:04


origen


Respuestas:


Puedes usar el + operador para combinarlos:

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

mergedlist = listone + listtwo

Salida:

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

2694
2017-11-12 07:07



También es posible crear un generador que simplemente itere sobre los elementos en ambas listas. Esto le permite encadenar listas (o cualquier iterable) para procesar sin copiar los elementos a una nueva lista:

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

214
2017-11-12 20:01



Puede usar conjuntos para obtener una lista combinada de valores únicos

mergedlist = list(set(listone + listtwo))

154
2017-09-20 08:43



También podrías usar extend para agregar un list agrega el final de otro:

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

99
2018-02-25 15:13



Pitón >= 3.5 alternativa: [*l1, *l2]

Aunque esta es una respuesta anterior, se ha introducido otra alternativa mediante la aceptación de PEP 448 que merece ser mencionado.

El PEP, titulado Generalizaciones adicionales de desembalaje, en general, redujo algunas restricciones sintácticas cuando se usa la estrella * expresión en Python; Con eso, unir dos listas (se aplica a cualquier iterable) ahora también se puede hacer con:

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

Esta funcionalidad fue definido para Python 3.5 no ha sido transferido a versiones anteriores en el 3.x familia. En versiones no compatibles a SyntaxError va a ser levantado.

Al igual que con los otros enfoques, esto también crea como una copia superficial de los elementos en las listas correspondientes.


los boca arriba a este enfoque es que realmente no necesita listas para realizarlo, cualquier cosa que sea iterable servirá. Como se indica en el PEP:

Esto también es útil como una forma más legible de sumar iterables en un   lista, como my_list + list(my_tuple) + list(my_range) que es ahora   equivalente a solo [*my_list, *my_tuple, *my_range].

Entonces, mientras que la adición con + levantaría un TypeError debido a la falta de coincidencia de tipos:

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

Lo siguiente no:

res = [*l, *r]

porque primero descomprimirá el contenido de los iterables y luego simplemente creará un list de los contenidos.


94
2017-11-12 07:07



Esto es bastante simple, creo que incluso se mostró en el tutorial:

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

57
2018-03-05 09:15



Podrías simplemente usar el + o += operador de la siguiente manera:

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

c = a + b

O:

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

c += (a + b)

Además, si desea que los valores en la lista fusionada sean únicos, puede hacer:

c = list(set(a + b))

33
2017-10-09 23:21



Esta pregunta directamente pregunta acerca de unir dos listas. Sin embargo, es bastante alta en la búsqueda, incluso cuando buscas una forma de unirte a muchas listas (incluido el caso cuando te unes a cero listas). Considere este enfoque más genérico:

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

Se producirá:

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

Tenga en cuenta que esto también funciona correctamente cuando a es [] o [[1,2,3]].

Sin embargo, esto se puede hacer de manera más eficiente con itertools:

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

Si no necesitas una list, pero solo un iterable, omite list().

Actualizar

La alternativa sugerida por Patrick Collins en los comentarios también podría funcionar para usted:

sum(a, [])

29
2018-02-05 05:01



Vale la pena señalar que el itertools.chain la función acepta una cantidad variable de argumentos:

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

Si un iterable (tupla, lista, generador, etc.) es la entrada, el from_iterable método de clase puede ser utilizado:

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

20
2017-07-21 00:53



Con Python 3.3+ puedes usar rendimiento de:

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]

O bien, si desea admitir un número arbitrario de iteradores:

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
2017-07-07 13:30



Si desea combinar las dos listas en forma ordenada, puede usar la función de fusión de la biblioteca heapq.

from heapq import merge

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

print list(merge(a,b))

14
2017-10-20 09:32