¿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]
¿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]
[1,2,5] and [2,4,5,6]
? ¿Quieres que se incluyan, excluyan o no te importen los duplicados?Respuestas:
Puede usar el
+
operador para combinarlos:Salida:
fuente
listone += listtwo
resultados enlistone == [1, 2, 3, 4, 5, 6]
list3 = listone
listone+=listtwo
¿también se ha cambiado list3?También es posible crear un generador que simplemente itera sobre los elementos en ambas listas usando
itertools.chain()
. Esto le permite encadenar listas (o cualquier iterable) para procesarlas sin copiar los elementos a una nueva lista:fuente
chain
está en el lado más lento (pero no mucho) para dos listas, pero es la solución más rápida para encadenar múltiples listas (n >> 2).>= 3.5
Alternativa a Python :[*l1, *l2]
Se ha introducido otra alternativa a través de la aceptación de la
PEP 448
cual merece mencionarse.El PEP, titulado Generalizaciones adicionales de desempaque , generalmente redujo algunas restricciones sintácticas cuando se usa la
*
expresión con estrella en Python; con él, unir dos listas (se aplica a cualquier iterable) ahora también se puede hacer con:Esta funcionalidad se definió para Python
3.5
, no se ha respaldado a versiones anteriores de la3.x
familia. En versiones no compatibles, se generará unSyntaxError
.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 necesita listas para realizarlo, cualquier cosa que sea iterable servirá. Como se indica en la PEP:
Entonces, mientras que la adición con
+
aumentaría unaTypeError
falta de coincidencia debido al tipo:Lo siguiente no lo hará:
porque primero descomprimirá el contenido de los iterables y luego simplemente creará a
list
partir de los contenidos.fuente
res = [*l1, *reversed(l2)]
. Comoreversed
devuelve un iterador,res = l1 + reversed(l2)
arrojaría un error.Puede usar conjuntos para obtener una lista fusionada de valores únicos
fuente
listone + [x for x in listtwo if x not in listone]
import collections; mergedlist = list(collections.OrderedDict.fromkeys(listone + listtwo))
hará el truco.También puede usar el
list.extend()
método para agregar unlist
al final de otro:Si desea mantener intacta la lista original, puede crear un nuevo
list
objeto yextend
ambas listas:fuente
A partir de 3.7, estos son los métodos stdlib más populares para concatenar dos (o más) listas en python.
Actuación
Concatenación de 2 listas 1
No hay mucha diferencia entre estos métodos, pero eso tiene sentido dado que todos tienen el mismo orden de complejidad (lineal). No hay una razón particular para preferir uno sobre el otro, excepto por cuestiones de estilo.
Concatenación de la lista N
Las parcelas se han generado utilizando el módulo perfplot . Código, para su referencia.
1. Los métodos
iadd
(+=
) yextend
funcionan en el lugar, por lo que se debe generar 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 UTILICE EL MÉTODO DUNDER
list.__add__
directamente de ninguna manera o forma. De hecho, manténgase alejado de los métodos dunder y use los operadores y lasoperator
funciones para los que fueron diseñados. Python tiene una semántica cuidadosa que es más complicada que simplemente llamar directamente al dunder. Aquí hay un ejemplo . Entonces, para resumir,a.__add__(b)
=> MALO;a + b
=> BUENO.Algunas respuestas aquí ofrecen
reduce(operator.add, [a, b])
una concatenación por pares: esto es lo mismo quesum([a, b], [])
solo más palabras.Cualquier método que use
set
eliminará duplicados y perderá el pedido. Usar con precaución.for i in b: a.append(i)
es más prolijo y más lento quea.extend(b)
, que es una función de llamada ú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. Ver 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
La lista de elementos de una función es un método aceptable, pero lochain
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 paraa + b
. Sus casos de uso son principalmente para el envío de métodos dinámicos. De lo contrario, prefieroa + b
que sea más corto y más legible, en mi opinión . YMMV.fuente
"There's not much difference between these methods but that makes sense given they all have the same order of complexity (linear). There's no particular reason to prefer one over the other except as a matter of style.
"Soluciones que no figuran en mi respuesta, o criticadas en" Comentarios "Recomiendo no usar.Esto es bastante simple, y creo que incluso se mostró en el tutorial :
fuente
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:
También puedes crear generadores:
Vieja respuesta
Considere este enfoque más genérico:
Saldrá:
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
:Si no necesita un
list
, pero solo un iterable, omitalist()
.Actualizar
La alternativa sugerida por Patrick Collins en los comentarios también podría funcionar para usted:
fuente
reduce
ahora está dentro,functools
por lo que deberá importarlo primero.Simplemente puede usar el operador
+
o de la+=
siguiente manera:O:
Además, si desea que los valores de la lista combinada sean únicos, puede hacer lo siguiente:
fuente
list(dict.fromkeys(a + b))
Vale la pena señalar que la
itertools.chain
función acepta un número variable de argumentos:Si la entrada es un iterable (tupla, lista, generador, etc.),
from_iterable
se puede usar el método de clase:fuente
Con Python 3.3+ puedes usar el rendimiento de :
O, si desea admitir un número arbitrario de iteradores:
fuente
itertools.chain
(que es equivalente) en lugar de definir su propia función.Si desea fusionar las dos listas en forma ordenada, puede usar la
merge
función de laheapq
biblioteca.fuente
Si no puede usar el operador más (
+
), puede usar laoperator
importación:Alternativamente, también puede usar la función
__add__
dunder :fuente
+
está fuera de la mesa, useoperator.add
.Como una 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 según esta respuesta es la mejor manera de aplanar una lista anidada:1. Tenga en cuenta que
chain.from_iterable()
está disponible en Python 2.6 y versiones posteriores. En otras versiones, usechain(*l)
.fuente
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 :-)).
fuente
heapq.merge
.Puede usar el
append()
método definido en loslist
objetos:fuente
El código anterior, no conserva el orden, elimina los duplicados de cada lista (pero no de la lista concatenada)
fuente
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 escenaitertools.chain()
simplemente hace lo siguiente:(vea https://docs.python.org/2/library/itertools.html ), así que me inspiré aquí y escribí algo en este sentido:
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 recorrer múltiples variables al mismo tiempo.fuente
Use una simple lista de comprensión:
Tiene todas las ventajas del enfoque más nuevo de usar Generalizaciones de desempaquetado adicionales , 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 .
fuente
Una forma realmente concisa de combinar una lista de listas es
lo que nos da
fuente
list.__add__
, useoperator.add
en su lugar. Este es el equivalente más prolijo delsum(list_of_lists, [])
cual es igual de malo. ¡NO UTILICE!obj.__class__
yobj.__dict__
.En Python puedes concatenar dos matrices de dimensiones compatibles con este comando
fuente
Entonces hay dos formas fáciles.
+
: crea una nueva lista a partir de las listas proporcionadasEjemplo:
Ejemplo:
Por lo tanto, vemos que de dos de los métodos más populares,
extend
es eficiente.fuente
chain.from_iterable
).Hay varias formas de concatenar listas en Python.
fuente
Salida:
fuente
Si desea una nueva lista mientras mantiene las dos listas anteriores:
fuente
fuente
Puedes seguir el código
fuente