2012-02-22 17 views
6

I tienen una lista de tuplas:Cómo combinar un número arbitrario de tuplas en Python?

l=[(1,2,3),(4,5,6)] 

La lista puede tener una longitud arbitraria, al igual que las tuplas. Me gustaría convertir esto en una lista o tupla de los elementos, en el orden en que aparecen:

f=[1,2,3,4,5,6] # or (1,2,3,4,5,6) 

si sé el tiempo en el desarrollo de cuántos tuplas voy a volver, tan sólo pudiera agregarlos :

m = l[0] + l[1] # (1,2,3,4,5,6) 

Pero como no sé hasta el momento de ejecución cuántas tuplas tendré, no puedo hacer eso. Siento que hay una forma de usar map para hacer esto, pero no puedo resolverlo. Puedo iterar sobre las tuplas y agregarlas a un acumulador, pero eso crearía muchas tuplas intermedias que nunca se usarían. También podría iterar sobre las tuplas, luego los elementos de las tuplas y anexarlas a una lista. Esto parece muy ineficiente. Tal vez hay una manera aún más fácil de ignorar por completo. ¿Alguna idea?

Respuesta

15

Chain ellos (sólo crea un generador en lugar de reservar memoria extra):

>>> from itertools import chain 
>>> l = [(1,2,3),(4,5,6)] 
>>> list(chain.from_iterable(l)) 
[1, 2, 3, 4, 5, 6] 
+0

Sabía que tenía que haber una forma de 'itertools' para hacerlo, pero por mi vida no pude encontrarlo. Aceptado. – technomalogical

9
l = [(1, 2), (3, 4), (5, 6)] 
print sum(l,()) # (1, 2, 3, 4, 5, 6) 
+0

Siempre me siento muy mal cuando yo abuso 'sum' esta manera . Pero eso no impidió que estallara en mi cabeza también. – zeekay

+0

¿Qué representa '()' como el valor 'start', o, ¿cómo funciona esto ?! Una tupla vacía? –

+0

Para listas más largas, esto será mucho más lento que chain.from_iterable; es O (n^2). [Dicho esto, a menudo lo hago yo mismo cuando sé que el tamaño de la lista es pequeño y delimitado.] – DSM

2
reduce(tuple.__add__, [(1,2,3),(4,5,6)]) 
2
tuple(i for x in l for i in x) # (1, 2, 3, 4, 5, 6) 
1
>>> from itertools import chain 
>>> l = [(1,2,3),(4,5,6)] 
>>> list(chain(*l)) 
[1, 2, 3, 4, 5, 6] 
2

Usar el estilo generador Pythonic para todos de los siguientes:

b=[(1,2,3),(4,5,6)] 

list = [ x for x in i for i in b ] #produces a list 
gen = (x for x in i for i in b) #produces a generator 
tup = tuple(x for x in i for i in b) #produces a tuple 

print list 
>> [1, 2, 3, 4, 5, 6] 
+1

Acabo de encontrar esto en el tutorial de estructuras de datos: http://docs.python.org/tutorial/datastructures.html#list-comprehensions. +1 para un buen ejemplo. – technomalogical

+0

@technomalogical gracias, por favor vote la respuesta. –

0

Puede combinar los valores de una lista utilizando la función .extend() así:

l = [(1,2,3), (4,5,6)] 
m = [] 
for t in l: 
    m.extend(t) 

o una versión más corta usando reducir:

l = [(1,2,3), (4,5,6)] 
m = reduce(lambda x,y: x+list(y), l, []) 
+0

¿Cuántos objetos de lista crearía si fuera grande? –

+1

Las listas tienen '.extend (iterable)'. No es necesario crear una nueva lista de 't'. – AndiDog

+0

@MattAlcock todos los objetos de la lista no enlazados serán limpiados por el recolector de basura, ¿correcto? lo siento, si no entendí bien tu pregunta. – rslnx

Cuestiones relacionadas