¿Cómo concateno dos listas en Python?

Resuelto y2k asked hace 14 años • 31 respuestas

¿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]
y2k avatar Nov 12 '09 14:11 y2k
Aceptado

Utilice el +operador para combinar las listas:

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

joinedlist = listone + listtwo

Producción:

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

NOTA: Esto creará una nueva lista con una copia superficial de los elementos de la primera lista, seguida de una copia superficial de los elementos de la segunda lista. Utilice copy.deepcopy() para obtener copias profundas de listas.

Daniel G avatar Nov 12 '2009 07:11 Daniel G

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

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

El PEP, titulado Generalizaciones adicionales de desempaquetado , generalmente redujo algunas restricciones sintácticas al usar la *expresión con asterisco 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, pero no se ha adaptado a versiones anteriores de la familia 3.x. En versiones no compatibles SyntaxErrorse generará a.

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


La ventaja de este enfoque es que realmente no necesitas 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 una lista, como my_list + list(my_tuple) + list(my_range)la que ahora equivale a solo [*my_list, *my_tuple, *my_range].

Entonces, si bien la suma con +generaría una TypeErrorfalta 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 descomprimirá el contenido de los iterables y luego simplemente creará un archivo lista partir del contenido.

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

import itertools
for item in itertools.chain(listone, listtwo):
    # Do something with each list item
Robert Rossney avatar Nov 12 '2009 20:11 Robert Rossney

¿Cómo concateno dos listas en Python?

A partir de la versión 3.9, estos son los métodos stdlib más populares para concatenar dos (o más) listas en Python.

Restricciones de versión ¿En su lugar? ¿Generalizar? *
a + b - No sum(list_of_lists, [])1
list(chain(a, b))2 >=2.3 No list(chain(*list_of_lists))
[*a, *b]3 >=3.5 No No
a += b - No
a.extend(b) - No

* Una solución calificará como solución generalizada si funciona para un número desconocido de listas (por ejemplo, dentro de un bucle o lista de comprensión).

Notas a pie de página

  1. Esta es una solución ingeniosa debido a su concisión. Pero sumrealiza la concatenación por pares, lo que significa que es una operación cuadrática ya que se debe asignar memoria para cada paso. NO LO USE si sus listas son grandes.

  2. Ver chain y chain.from_iterable de los documentos. Tendrás que hacerlo from itertools import chainprimero. La concatenación es lineal en la memoria, por lo que es la mejor en términos de rendimiento y compatibilidad de versiones. chain.from_iterablese introdujo en 2.6.

  3. Este método utiliza Generalizaciones de desempaquetado adicionales (PEP 448) , pero no puede generalizar a N listas a menos que descomprima cada una manualmente.

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


Actuación

Concatenación de 2 listas 1

ingrese la descripción de la imagen aquí

No hay mucha diferencia entre estos métodos, pero tiene sentido dado que todos tienen el mismo orden de complejidad (lineal). No hay ninguna razón particular para preferir uno sobre el otro excepto por una cuestión de estilo.

Concatenación de lista N

ingrese la descripción de la imagen aquí

Los gráficos se han generado utilizando el módulo perfplot . Código, para su referencia.

1. Los métodos iadd( +=) y extendfuncionan in situ, por lo que se debe generar una copia cada vez antes de realizar la prueba. Para mantener las cosas justas, todos los métodos tienen un paso de copia previa para la lista de la izquierda que se puede ignorar.


Comentarios sobre otras soluciones

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

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

  • Cualquier método que se utilice seteliminará duplicados y perderá el orden. Úselo con precaución.

  • for i in b: a.append(i)tiene más palabras y es más lento que a.extend(b), que es una llamada de función única y más idiomático. appendes 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.mergefuncionará, pero su caso de uso es fusionar listas ordenadas en tiempo lineal. Usarlo en cualquier otra situación es un antipatrón.

  • yieldListar elementos de una función es un método aceptable, pero chainlo 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, en mi opinión , prefiera a + bel que sea más corto y más legible . YMMV.

cs95 avatar Jun 01 '2019 15:06 cs95

También puedes usar el list.extend()método para agregar un listal final de otro:

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

listone.extend(listtwo)

Si desea mantener intacta la lista original, puede crear un nuevo listobjeto y extendambas listas:

mergedlist = []
mergedlist.extend(listone)
mergedlist.extend(listtwo)
Gourneau avatar Jan 22 '2013 07:01 Gourneau