2010-12-03 15 views

Respuesta

787

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

+1

Bueno, eso lo explica. Estaba buscando un nombre de función, no un operador (Sí, sé que los operadores están implementados por funciones ocultas.) –

+28

En realidad se puede hacer esto mediante el uso de una función no oculta: operador de importación, operator.add (list1, list2) –

+2

@NPE ¿Qué pasa si quiero concatenar un número arbitrario de la lista? ¿Cómo puedo definir la función? Gracias. – twlkyao

56

¿Qué tal list1 + list2?

+69

un minuto es la diferencia entre 300 votos – Vall3y

+4

500 ahora ...! :(:( –

+2

625 ...................! – Arun

38

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

+2

Tiene sentido modificar las listas originales si ya no necesita las listas no modificadas, entonces en este caso no tendría sentido. –

123

Dependiendo de cómo se va a utilizar una vez que se ha creado itertools.chain podría ser su mejor apuesta:

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

Esto crea un generador para los elementos de la lista combinada, que tiene la ventaja de que ningún nuevo lista debe ser creado, pero todavía se puede utilizar c como si fuera la concatenación de las dos listas:

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

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

Tenga en cuenta que este ejemplo utiliza los elementos en c, por lo que tendrá que reiniciarlo antes de poder volver a utilizarlo. Por supuesto, puede usar list(c) para crear la lista completa, pero eso creará una nueva lista en la memoria.

+8

solo diga que itertools.chain regresa un generador ... – Ant

15

Sólo para hacerle saber:

Cuando se escribe list1 + list2, a la que llama el método de __add__list1, que devuelve una nueva lista. de esta manera también puede tratar con myobject + list1 agregando el método __add__ a su clase personal.

15

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) 

No realmente ahorrar cualquier momento (listas intermedias todavía se crean), pero bueno si usted tiene un número variable de listas para aplanar , por ejemplo, *args.

67

También puede utilizar sum, si le dan un argumento 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 la + 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 las 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] 
+1

En Python 3.5.2, 'sum' está documentado para decir" Esta función está diseñada específicamente para usarse con valores numéricos y puede rechazar tipos no numéricos ". Por lo tanto, no estoy seguro de que 'sum' deba ser usado así. –

+0

Buena captura en la documenta ción. Es curioso que no solo rechazaran los valores no numéricos, en lugar de enterrar la intención en los documentos. – kevlarr

Cuestiones relacionadas