¿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]
2793
y2k 12 nov. 2009 a las 10:04

24 respuestas

La mejor respuesta

Puedes usar el operador + para combinarlas:

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

joinedlist = listone + listtwo

Salida:

>>> joinedlist
[1,2,3,4,5,6]
4278
TrebledJ 7 jun. 2019 a las 06:45

Vale la pena señalar que la función itertools.chain acepta un número 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 la entrada es un iterable (tupla, lista, generador, etc.), se puede usar el método de clase from_iterable:

>>> il = [['a'], ['b', 'c'], ['d', 'e', 'f']]
>>> [i for i in itertools.chain.from_iterable(il)]
['a', 'b', 'c', 'd', 'e', 'f']
29
Dariusz Walczak 5 feb. 2013 a las 05:01
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]
-2
Dimitris Fasarakis Hilliard 4 jul. 2017 a las 12:00

Si desea una nueva lista mientras mantiene las dos listas anteriores:

def concatenate_list(listOne, listTwo):
    joinedList = []
    for i in listOne:
        joinedList.append(i)
    for j in listTwo:
        joinedList.append(j)

    sorted(joinedList)

    return joinedList
-1
Ukendar Vadivel 31 jul. 2018 a las 09:35
import itertools

A = list(zip([1,3,5,7,9],[2,4,6,8,10]))
B = [1,3,5,7,9]+[2,4,6,8,10]
C = list(set([1,3,5,7,9] + [2,4,6,8,10]))

D = [1,3,5,7,9]
D.append([2,4,6,8,10])

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

F = []
for a in itertools.chain([1,3,5,7,9], [2,4,6,8,10]):
    F.append(a)


print ("A: " + str(A))
print ("B: " + str(B))
print ("C: " + str(C))
print ("D: " + str(D))
print ("E: " + str(E))
print ("F: " + str(F))

Salida:

A: [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
B: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
C: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
D: [1, 3, 5, 7, 9, [2, 4, 6, 8, 10]]
E: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
F: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
-1
JamesVeug 16 feb. 2018 a las 03:46

En Python puedes concatenar dos matrices de dimensiones compatibles con este comando

numpy.concatenate([a,b])
4
Cody Gray 26 jul. 2020 a las 17:00

Una forma realmente concisa de combinar una lista de listas es

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

Lo que nos da

[1, 2, 3, 4, 5, 6, 7, 8, 9]
4
Akash Singh 29 jun. 2018 a las 12:16

Use una simple lista de comprensión:

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

Tiene todas las ventajas del enfoque más reciente de usar Generalizaciones adicionales de desempaque - es decir, puede concatenar un número arbitrario de iterables diferentes (por ejemplo, listas, tuplas, rangos y generadores) de esa manera, y no se limita a Python 3.5 o posterior.

6
z33k 23 abr. 2019 a las 20:39

Como ya señalaron muchos, itertools.chain() es el camino a seguir si uno necesita aplicar exactamente el mismo tratamiento a ambas listas. En mi caso, tenía una etiqueta y una bandera que eran diferentes de una lista a otra, por lo que necesitaba algo un poco más complejo. Como resultado, detrás de escena itertools.chain() simplemente hace lo siguiente:

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

(consulte https://docs.python.org/2/library/itertools.html), así que me inspiré aquí y escribí algo en este sentido:

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

Los puntos principales a entender aquí son que las listas son solo un caso especial de iterable, que son objetos como cualquier otro; y que los for ... in bucles en python pueden funcionar con variables de tupla, por lo que es simple hacer bucles en múltiples variables al mismo tiempo.

6
Francesco Marchetti-Stasi 2 nov. 2015 a las 18:59
list(set(listone) | set(listtwo))

El código anterior, no conserva el orden, elimina los duplicados de cada lista (pero no de la lista concatenada)

7
SuperNova 7 jul. 2016 a las 07:42

Puede usar el método append() definido en los objetos list:

mergedlist =[]
for elem in listone:
    mergedlist.append(elem)
for elem in listtwo:
    mergedlist.append(elem)
7
Dimitris Fasarakis Hilliard 5 may. 2016 a las 09:05

Si necesita fusionar dos listas ordenadas con reglas de clasificación complicadas, es posible que tenga que pasarlo usted mismo como en el siguiente código (usando una regla de clasificación simple para facilitar la lectura :-)).

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])
12
Peter Mortensen 22 dic. 2013 a las 09:23

Como forma más general de obtener más listas, puede colocarlas dentro de una lista y usar la función itertools.chain.from_iterable() 1 que se basa en esta respuesta es la mejor manera de aplanar una lista anidada:

>>> 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. Tenga en cuenta que chain.from_iterable() está disponible en Python 2.6 y versiones posteriores. En otras versiones, use chain(*l).

17
Kasravnd 16 jul. 2020 a las 19:46

Si no puede usar el operador más (+), puede usar la importación operator:

import operator

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

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

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

Alternativamente, también puede usar la función __add__ dunder:

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

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

>>> [1, 2, 3, 4, 5, 6]
17
jpihl 4 jun. 2019 a las 07:09

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

from heapq import merge

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

print list(merge(a, b))
22
Peter Mortensen 17 mar. 2019 a las 09:19

Con Python 3.3+ puede 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, 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]
25
user688635user688635 21 jul. 2014 a las 00:53

Simplemente puede usar el operador + o += 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 de la lista combinada sean únicos, puede hacer lo siguiente:

c = list(set(a + b))
43
Peter Mortensen 22 dic. 2013 a las 09:21

Esta pregunta pregunta directamente sobre unir dos listas. Sin embargo, es bastante alto en la búsqueda, incluso cuando está buscando una forma de unirse a muchas listas (incluido el caso cuando se une a listas cero).

Creo que la mejor opción es usar listas de comprensión:

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

También puedes crear generadores:

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

Respuesta anterior

Considere este enfoque más genérico:

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

Saldrá:

[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 necesita un list, pero solo un iterable, omita list().

Actualizar

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

sum(a, [])
55
wonder.mice 4 sep. 2018 a las 18:15

¿Cómo concateno dos listas en Python?

A partir de 3.7, estos son los métodos stdlib más populares para concatenar dos (o más) listas en python.

enter image description here

Notas al pie

  1. Esta es una solución resbaladiza debido a su brevedad. Pero sum realiza la concatenación en forma de pares, lo que significa que esto es un La operación cuadrática como memoria tiene que ser asignada para cada paso. HACER NO UTILICE si sus listas son grandes.

  2. Ver chain y chain.from_iterable de los documentos. Necesitará import itertools primero. La concatenación es lineal en la memoria, por lo que este es el mejor en términos de compatibilidad de rendimiento y versión. chain.from_iterable se ha introducido en 2.6.

  3. Este método utiliza Generalizaciones adicionales de desempaque (PEP 448), pero no puede generalice a N listas a menos que desempaquete manualmente cada una usted mismo.

  4. a += b y a.extend(b) son más o menos equivalentes para todos los fines prácticos. += cuando se llama en una lista internamente llamará list.__iadd__, que extiende la primera lista por la segunda.


Actuación

Concatenación de 2 listas 1

enter image description here

Concatenación de N-List

enter image description here

Las parcelas se han generado utilizando el perfplot. Código, para su referencia.

1. Los métodos iadd (+=) y extend funcionan en el lugar, por lo que debe generarse una copia cada vez antes de la prueba. Para mantener las cosas justas, todos los métodos tienen un paso previo a la copia para la lista de la izquierda que puede ignorarse.


Comentarios sobre otras soluciones

  • NO USE EL MÉTODO DUNDER list.__add__ directamente de ninguna manera, forma o forma. De hecho, manténgase alejado de los métodos dunder y use los operadores y las funciones operator como fueron diseñados. Python tiene una semántica cuidadosa incorporada en estos que son más complicados que simplemente llamar al dunder directamente. Aquí tienes un ejemplo. Entonces, para resumir, a.__add__(b) => MALO; a + b => BUENO.

  • Algunas respuestas aquí ofrecen reduce(operator.add, [a, b]) para la concatenación por pares; esto es lo mismo que sum([a, b], []) solo más prolijo.

  • Cualquier método que use set eliminará los duplicados y perderá el pedido. Usar con precaución.

  • for i in b: a.append(i) es más prolijo y más lento que a.extend(b), que es llamada de función única y más idiomático. append es más lento debido a la semántica con la que se asigna y crece la memoria para las listas. Vea aquí para una discusión similar.

  • heapq.merge funcionará, pero su caso de uso es para fusionar listas ordenadas en tiempo lineal. Usarlo en cualquier otra situación es un antipatrón.

  • yield ing elementos de la lista de una función es un método aceptable, pero chain lo hace más rápido y mejor (tiene una ruta de código en C, por lo que es rápido).

  • operator.add(a, b) es un equivalente funcional aceptable a a + b. Sus casos de uso son principalmente para el envío de métodos dinámicos. De lo contrario, prefiera a + b, que es más corto y más legible, en mi opinión . YMMV.

138
cs95 25 jul. 2020 a las 06:36

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

>>> listone = [1,2,3]
>>> listtwo = [4,5,6]
>>>
>>> listone + listtwo
[1, 2, 3, 4, 5, 6]
82
Peter Mortensen 17 mar. 2019 a las 09:15

También puede usar extend en orden para agregar un list al final de otro:

listone = [1,2,3]
listtwo = [4,5,6]
mergedlist = []
mergedlist.extend(listone)
mergedlist.extend(listtwo)
219
4 revs, 3 users 57% 30 may. 2020 a las 18:02

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

mergedlist = list(set(listone + listtwo))
229
thefourtheye 2 abr. 2014 a las 07:28

Python >= 3.5 alternativa: [*l1, *l2]

Se ha introducido otra alternativa mediante la aceptación de PEP 448 que merece ser mencionado.

El PEP, titulado Generalizaciones adicionales de desempaquetado , generalmente redujo algunas restricciones sintácticas al usar la expresión destacada * en Python; con él, unir dos listas (se aplica a cualquier iterable) ahora también se puede hacer con:

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

Esta funcionalidad se definió para Python 3.5 no se ha soportado en versiones anteriores en la familia 3.x. En versiones no compatibles, se generará un SyntaxError.

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


La ventaja de 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 ahora es equivalente a solo [*my_list, *my_tuple, *my_range].

Entonces, si bien la adición con + generarí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 lo hará:

res = [*l, *r]

Porque primero desempaquetará el contenido de los iterables y luego simplemente creará un list a partir de los contenidos.

341
Boris 22 nov. 2019 a las 12:44

También es posible crear un generador que simplemente repita los elementos en ambas listas usando {{ X0}}. Esto le permite encadenar listas (o cualquier iterable) para procesarlas sin copiar los elementos a una nueva lista:

import itertools
for item in itertools.chain(listone, listtwo):
    # Do something with each list item
344
Boris 22 nov. 2019 a las 12:53
1720421