2011-09-26 25 views
94

Duplicar posibles:
A Transpose/Unzip Function in PythonDesembalaje una lista/tupla de pares en dos listas/tuplas

Tengo una lista que tiene este aspecto:

I desea separar la lista en 2 listas.

list1 = ('1','2','3','4') 
list2 = ('a','b','c','d') 

puedo hacerlo por ejemplo, con:

list1 = [] 
list2 = [] 
for i in list: 
    list1.append(i[0]) 
    list2.append(i[1]) 

Pero quiero saber si hay una solución más elegante.

+7

No utilice nombres de tipos incorporados para las variables. No lo llames 'lista'. Una vez que ha creado una 'lista' variable, comienza a suceder cosas extrañas porque la función incorporada' list() 'ahora está oculta por su variable. –

+2

Eso es una tupla, no una lista. Es importante mantenerlos en línea recta en Python, a pesar de que se pueden usar de manera similar. –

Respuesta

183
>>> source_list = ('1','a'),('2','b'),('3','c'),('4','d') 
>>> list1, list2 = zip(*source_list) 
>>> list1 
('1', '2', '3', '4') 
>>> list2 
('a', 'b', 'c', 'd') 

Editar: Tenga en cuenta que zip(*iterable) es su propio inverso:

>>> list(source_list) == zip(*zip(*source_list)) 
True 

Al desembalar en dos listas, esto se convierte en:

>>> list1, list2 = zip(*source_list) 
>>> list(source_list) == zip(list1, list2) 
True 

adición sugerida por rocksportrocker.

+5

Para el OP, http://stackoverflow.com/questions/5239856/foggy-on-asterisk-in-python es útil si no conoce el operador "splat". – dicato

+5

Quiero señalar que los resultados de 'zip (* list_of_pairs)' no son un par de 'list', sino' tuple'. La diferencia puede ser importante en algunos casos (por ejemplo, agregarle). Entonces el 'list1' y' list2' en el ejemplo deberían ser realmente 'tuple1' y' tuple2'. – Causality

+0

@Causalidad Definitivamente cierto. Usé los mismos nombres utilizados en la pregunta, donde también son 'tuple's. El error fue señalado en un comentario sobre la pregunta cuando este fue publicado originalmente: http://stackoverflow.com/questions/7558908/unpacking-a-list-tuple-of-pairs-into-two-lists-tuples/ 7558990? Noredirect = 1 # comment9163175_7558908 – agf

17
list1= (x[0] for x in source_list) 
list2= (x[1] for x in source_list) 
+2

Si necesita una 'lista' real que puede indexar, debe usar corchetes cuadrados' [] 'en lugar de paréntesis para hacer que se enumeren las comprensiones en lugar de las expresiones del generador. – agf

+0

-1, la solución con zip() es más pitonica y no tiene dos lazos para bucle – naeg

+7

@naeg, esta es una expresión pitonica perfectamente correcta. Incluso podría argumentar que para el programador menos entrenado esta es una solución mejor que usar la sintaxis 'zip (* ...)' bastante borrosa. – KillianDS

Cuestiones relacionadas