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

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]

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

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.


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

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)

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.


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]

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, [])

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

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

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]

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

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]

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


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

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)

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)


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.


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 .


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]

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

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.


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]

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]

-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

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

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]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.