¿Cómo puedo obtener la concatenación de dos listas en Python sin modificar ninguna de ellas?

En Python, la única forma 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?

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

Dependiendo de cómo lo vaya a usar una vez que lo haya creado, itertools.chain podría ser su mejor itertools.chain :

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

Esto crea un generador para los elementos en la lista combinada, lo 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, entonces este y otros métodos del módulo itertools son muy útiles de conocer.

Tenga en cuenta que este ejemplo utiliza los elementos en c , por lo que deberá reinicializarlo antes de poder reutilizarlo. Por supuesto, solo puede usar la list(c) para crear la lista completa, pero eso creará una nueva lista en la memoria.

concatenated_list = list_1 + list_2

También puedes usar la sum , si le das un argumento de start :

 >>> 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 el 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 cuerdas:

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

siempre se puede crear una nueva lista que sea 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, así que creo que tiene sentido modificar las listas originales extendiendo o agregando.

Y si tienes 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 (aún se crean listas intermedias), pero está bien si tiene un número variable de listas para aplanar, por ejemplo, *args .

Sólo para hacerle saber:

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