Pregunta ¿Cómo puedo obtener la concatenación de dos listas en Python sin modificar ninguna? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

En Python, la única forma en que puedo encontrar para concatenar dos listas es list.extend, que modifica la primera lista. ¿Hay alguna función de concatenación que devuelva su resultado sin modificar sus argumentos?


506
2017-12-03 09:16


origen


Respuestas:


Sí: list1+list2. Esto da una nueva lista que es la concatenación de list1 y list2.


871
2017-12-03 09:17



Dependiendo de cómo va a usarlo una vez que se haya creado itertools.chain podría ser tu mejor apuesta:

>>> import itertools
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = itertools.chain(a, b)

Esto crea un generador para los artículos en la lista combinada, que tiene la ventaja de que no es necesario crear una nueva lista, pero aún puede usar c como si fuera la concatenación de las dos listas:

>>> for i in c:
...     print i
1
2
3
4
5
6

Si sus listas son grandes y la eficiencia es una preocupación, este y otros métodos del itertools módulo son muy útiles para saber.

Tenga en cuenta que este ejemplo utiliza los elementos en c, entonces necesitarías reiniciarlo antes de poder reutilizarlo. Por supuesto que puedes simplemente usar list(c) para crear la lista completa, pero eso creará una nueva lista en la memoria.


132
2017-12-03 10:41



Qué tal si list1 + list2?


77
2017-12-03 09:18



También puedes usar sum, si le das una start argumento:

>>> list1, list2, list3 = [1,2,3], ['a','b','c'], [7,8,9]
>>> all_lists = sum([list1, list2, list3], [])
>>> all_lists
[1, 2, 3, 'a', 'b', 'c', 7, 8, 9]

Esto funciona en general para cualquier cosa que tenga + operador:

>>> sum([(1,2), (1,), ()], ())
(1, 2, 1)

>>> sum([Counter('123'), Counter('234'), Counter('345')], Counter())
Counter({'1':1, '2':2, '3':3, '4':2, '5':1})

>>> sum([True, True, False], False)
2

Con la notable excepción de cadenas:

>>> sum(['123', '345', '567'], '')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]

74
2018-02-12 13:06



siempre puedes crear una nueva lista que es el resultado de agregar dos listas.

>>> k = [1,2,3] + [4,7,9]
>>> k
[1, 2, 3, 4, 7, 9]

Las listas son secuencias mutables, por lo que creo que tiene sentido modificar las listas originales mediante extender o adjuntar.


40
2017-12-03 09:18



Sólo para hacerle saber:

Cuando escribes list1 + list2, estás llamando al __add__ método de list1, que devuelve una nueva lista. de esta manera también puedes lidiar con myobject + list1 agregando el __add__ método para su clase personal.


15
2017-12-03 12:50



Y si tiene más de dos listas para concatenar:

import operator
list1, list2, list3 = [1,2,3], ['a','b','c'], [7,8,9]
reduce(operator.add, [list1, list2, list3])

# or with an existing list
all_lists = [list1, list2, list3]
reduce(operator.add, all_lists)

En realidad, no le ahorra tiempo (todavía se crean listas intermedias), pero es bueno si tiene una cantidad variable de listas para aplanar, por ejemplo, *args.


15
2017-08-27 08:41