¿Cómo concateno 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]
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.
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 SyntaxError
se 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 TypeError
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 descomprimirá el contenido de los iterables y luego simplemente creará un archivo list
a 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
¿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 |
- | Sí | No |
a.extend(b) |
- | Sí | 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
Esta es una solución ingeniosa debido a su concisión. Pero
sum
realiza 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.Ver
chain
ychain.from_iterable
de los documentos. Tendrás que hacerlofrom itertools import chain
primero. 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_iterable
se introdujo en 2.6.Este método utiliza Generalizaciones de desempaquetado adicionales (PEP 448) , pero no puede generalizar a N listas a menos que descomprima cada una manualmente.
a += b
ya.extend(b)
son más o menos equivalentes a todos los efectos prácticos.+=
cuando se le llama en una lista, se llamará internamentelist.__iadd__
, lo que extiende la primera lista por la segunda.
Actuación
Concatenación de 2 listas 1
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
Los gráficos se han generado utilizando el módulo perfplot . Código, para su referencia.
1. Los métodos iadd
( +=
) y extend
funcionan 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 yoperator
funciones 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 quesum([a, b], [])
solo que tiene más palabras.Cualquier método que se utilice
set
eliminará 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 quea.extend(b)
, que es una 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 fusionar listas ordenadas en tiempo lineal. Usarlo en cualquier otra situación es un antipatrón.yield
Listar elementos de una función es un método aceptable, perochain
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 aa + b
. Sus casos de uso son principalmente para el envío de métodos dinámicos. De lo contrario, en mi opinión , prefieraa + b
el que sea más corto y más legible . YMMV.
También puedes usar el list.extend()
método para agregar un list
al 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 list
objeto y extend
ambas listas:
mergedlist = []
mergedlist.extend(listone)
mergedlist.extend(listtwo)