¿Cómo concateno dos listas en Python?

2531

¿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
fuente
66
¿Desea simplemente agregar o desea fusionar las dos listas en orden ? ¿Qué salida esperas para [1,3,6] y [2,4,5]? ¿Podemos suponer que ambas sublistas ya están ordenadas (como en su ejemplo)?
smci
1
... también, ¿qué pasa si las listas tienen duplicados, por ejemplo [1,2,5] and [2,4,5,6]? ¿Quieres que se incluyan, excluyan o no te importen los duplicados?
smci

Respuestas:

3905

Puede usar el +operador para combinarlos:

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

joinedlist = listone + listtwo

Salida:

>>> joinedlist
[1,2,3,4,5,6]
Daniel G
fuente
110
¿esto crea una copia profunda de listone y agrega listtwo?
Daniel F
152
@Daniel 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. Use copy.deepcopy para obtener copias profundas de las listas.
Daniel G
219
otro detalle útil aquí: listone += listtworesultados enlistone == [1, 2, 3, 4, 5, 6]
rickcnagy
16
@ br1ckb0t ¿cambiará eso a lo que apunta Listone? Entonces: list3 = listone listone+=listtwo ¿también se ha cambiado list3?
MikeH
11
cambia la lista 3. Sin embargo, si eso no es un problema, es más sencillo y legible agregar las dos listas en lugar de crear una nueva.
rickcnagy
320

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:

import itertools
for item in itertools.chain(listone, listtwo):
    # Do something with each list item
Robert Rossney
fuente
44
chainestá 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).
cs95
@ cs95 lento en comparación con qué?
Moberg
@Moberg En comparación con otras formas de concatenación de listas, como referencia, consulte mis puntos de referencia aquí .
cs95
265

>= 3.5Alternativa a Python :[*l1, *l2]

Se ha introducido otra alternativa a través de la aceptación de la PEP 448cual 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:

>>> 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 Python3.5 , no se ha respaldado a versiones anteriores de la 3.xfamilia. En versiones no compatibles, se generará un SyntaxError.

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:

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

Entonces, mientras que la adición con +aumentaría una TypeErrorfalta de coincidencia debido al tipo:

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á a listpartir de los contenidos.

Dimitris Fasarakis Hilliard
fuente
1
Un buen ejemplo del enfoque de desempaquetado que funciona en tipos iterables son las funciones que devuelven un iterador sobre una de las listas que está concatenando. Por ejemplo, se podría revertir una de las listas que estés concatenación: res = [*l1, *reversed(l2)]. Como reverseddevuelve un iterador, res = l1 + reversed(l2)arrojaría un error.
alan
2
Vale la pena señalar que esto es análogo a la combinación de diccionarios en python. dict3 = {** dict1, ** dict2}. Observe que usamos ** para desempaquetar el diccionario, mientras que con las listas usamos * para desempaquetar.
Kevin S
213

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

mergedlist = list(set(listone + listtwo))
Radagast
fuente
45
Es cierto, sin embargo, también eliminará los duplicados, si eso es lo que le interesa. Además de la lista no haría eso.
metasoarous
1
¿Cuál es la forma de hacer eso y mantener la información de pedido?
Natim
11
Mejor quelistone + [x for x in listtwo if x not in listone]
Natim
8
+1 en mi humilde opinión, esta es la forma correcta de "fusionar" listas (unión), mientras que la respuesta "aprobada" describe cómo combinar / agregar listas (multiset)
alfasin
2
Si le importa mantener el orden de entrada, entonces import collections; mergedlist = list(collections.OrderedDict.fromkeys(listone + listtwo))hará el truco.
SethMMorton
186

También puede 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
fuente
82

¿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.

ingrese la descripción de la imagen aquí

Notas al pie

  1. Esta es una solución resbaladiza debido a su brevedad. Pero sumrealiza la concatenación en forma de pares, lo que significa que esta es una operación cuadrática ya que la memoria debe asignarse para cada paso. NO USE si sus listas son grandes.

  2. Ver chain y chain.from_iterable de los documentos. Necesitarás import itertoolsprimero. 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_iterablefue introducido en 2.6.

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

  4. a += by a.extend(b)son más o menos equivalentes para todos los fines prácticos. +=cuando se llama en una lista, 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 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

ingrese la descripción de la imagen aquí

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

1. Los métodos iadd( +=) y extendfuncionan 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 las operatorfunciones 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 que sum([a, b], [])solo más palabras.

  • Cualquier método que use seteliminará 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 una función de llamada ú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. Ver aquí para una discusión similar.

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

  • yieldLa lista de elementos de una función es un método aceptable, pero lo chainhace 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 para a + b. Sus casos de uso son principalmente para el envío de métodos dinámicos. De lo contrario, prefiero a + bque sea más corto y más legible, en mi opinión . YMMV.

cs95
fuente
las respuestas a stackoverflow.com/q/36863404/125507 podrían usar un diagrama de trama (incluida la solución de numba)
endolito
@endolith mordió el trabajo, pero echaré un vistazo y veré si puedo contribuir. Ty.
cs95
¿Cuál es el mejor método que el rendimiento más rápido? informe a.
Ganeshdeshmukh
@ganeshdeshmukh El TL; DR es que todos son buenos y cuál eliges es principalmente una cuestión de estilo. "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.
cs95
78

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]
Tuure Laurinolli
fuente
51

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

Vieja respuesta

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 aes []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, [])
wonder.mice
fuente
3
Nota de Python 3: reduceahora está dentro, functoolspor lo que deberá importarlo primero.
Dimitris Fasarakis Hilliard
41

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))
Un mito
fuente
La última parte puede reordenar arbitrariamente los artículos. Si desea preservar el orden, en CPython 3.6+ puede hacerlolist(dict.fromkeys(a + b))
Boris el
27

Vale la pena señalar que la itertools.chainfunción 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.), from_iterablese puede usar el método de clase:

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

Con Python 3.3+ puedes usar el 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]

fuente
Puede usar itertools.chain(que es equivalente) en lugar de definir su propia función.
Boris
18

Si desea fusionar las dos listas en forma ordenada, puede usar la mergefunción de la heapqbiblioteca.

from heapq import merge

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

print list(merge(a, b))
lavee_singh
fuente
15

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

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]
jpihl
fuente
3
Agarrar a los dunders generalmente no es el mejor enfoque. Si +está fuera de la mesa, use operator.add.
Dimitris Fasarakis Hilliard
2
¿Por qué el operador plus no estaría disponible?
cs01
2
Normalmente no lo haría :) pero si está haciendo una concatenación de listas con la función de mapa o si desea almacenar la función de agregar en una variable, no puede usar +.
jpihl
13

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:

>>> 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).

Kasramvd
fuente
10

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])
Señor tiburón
fuente
O simplemente usar heapq.merge.
cs95
7

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

mergedlist =[]
for elem in listone:
    mergedlist.append(elem)
for elem in listtwo:
    mergedlist.append(elem)
mingxiao
fuente
99
para que lo sepas, si esto es lo que estás haciendo en la práctica, esto es mucho, mucho más lento que los otros métodos propuestos. ver stackoverflow.com/questions/17479361/…
Ryan Haining
7
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)

SuperNova
fuente
6

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

(vea 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 ... inbucles en python pueden funcionar con variables de tupla, por lo que es simple recorrer múltiples variables al mismo tiempo.

Francesco Marchetti-Stasi
fuente
5

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

z33k
fuente
4

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]
Akash Singh
fuente
Por favor no use list.__add__, use operator.adden su lugar. Este es el equivalente más prolijo del sum(list_of_lists, [])cual es igual de malo. ¡NO UTILICE!
cs95
@ CS95 puede explicar cuál es el problema utilizando la lista .__ add__
Akash Singh
Los métodos dunder son "métodos privados" y, por lo general, no deben usarse directamente (son llamados por otras funciones). Las excepciones son obj.__class__y obj.__dict__.
cs95
3

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

numpy.concatenate([a,b])
Michael Grossmann
fuente
44
La pregunta no pide numpy.
cs95
2

Entonces hay dos formas fáciles.

  1. Uso+ : crea una nueva lista a partir de las listas proporcionadas

Ejemplo:

In [1]: a = [1, 2, 3]

In [2]: b = [4, 5, 6]

In [3]: a + b
Out[3]: [1, 2, 3, 4, 5, 6]

In [4]: %timeit a + b
10000000 loops, best of 3: 126 ns per loop
  1. Usando extender : agrega una nueva lista a la lista existente. Eso significa que no crea una lista separada.

Ejemplo:

In [1]: a = [1, 2, 3]

In [2]: b = [4, 5, 6]

In [3]: %timeit a.extend(b)
10000000 loops, best of 3: 91.1 ns per loop

Por lo tanto, vemos que de dos de los métodos más populares, extendes eficiente.

Vishvajit Pathak
fuente
2
¿Qué sucede si necesito agregar varias listas, como a + b + c + d + e?
Tweakimp
2
@Tweakimp Vea esta respuesta que tiene un par de opciones (lo recomiendo chain.from_iterable).
cs95
2

Hay varias formas de concatenar listas en Python.

l1 = [1,2,3,4]
l2 = [3,4,5,6]

 1. new_list = l1.copy()
    new_list = new_list.extend(l2)
 2. new_list = l1 + l2
 3. new_list = [*l1, *l2]
chatrapathi
fuente
1
¿Podría explicar qué información nueva proporciona esta respuesta sobre las demás?
cs95
Hay varias formas de concatenar listas en Python , que están cubiertas ampliamente en otras respuestas mucho más antiguas. ¿Qué nueva información proporciona esto?
Tomerikoo
-1
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]
JamesVeug
fuente
-1

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
Ukendar Vadivel
fuente
¿Cómo es eso diferente de esta respuesta de mingxiao?
Tomerikoo
-2
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]
James Miller
fuente
44
Bueno, por favor haga alguna explicación
U10-Forward
¿Cuál es el punto de los argumentos de la función si está utilizando los nombres globales dentro de ella?
Tomerikoo
-2

Puedes seguir el código

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

for i in listone:
    listtwo.append(i)
print(listtwo)

[1,2,3,4,5,6]
isiful siful
fuente