2011-09-26 19 views
94

Eventuali duplicati:
A Transpose/Unzip Function in Pythondisimballaggio un elenco/tupla di coppie in due elenchi/tuple

Ho una lista che assomiglia a questo:

I voglio separare la lista in 2 liste.

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

posso farlo ad esempio con:

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

Ma voglio sapere se c'è una soluzione più elegante.

+7

Si prega di non utilizzare nomi di tipi integrati per variabili. Non chiamarlo 'list'. Una volta creata una variabile 'list', si iniziano ad avere cose strane perché la funzione built-in' list() 'è ora nascosta dalla variabile. –

+2

Questa è una tupla, non una lista. È importante mantenerli dritti in Python, anche se possono essere usati allo stesso modo. –

risposta

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') 

Edit: noti che zip(*iterable) è la sua inversa:

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

All'apertura della confezione, in due liste, questo diventa:

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

aggiunta suggerito da rocksportrocker.

+5

Per l'OP, http://stackoverflow.com/questions/5239856/foggy-on-asterisk-in-python è utile se non si conosce l'operatore "splat". – dicato

+5

Voglio sottolineare che i risultati di 'zip (* list_of_pairs)' non sono un paio di 'list' ma' tuple'. La differenza può essere importante in alcuni casi (ad esempio, append ad esso). Quindi 'lista1' e' lista2' nell'esempio dovrebbero essere 'tuple1' e' tuple2'. – Causality

+0

@Causality Sicuramente vero. Ho usato gli stessi nomi usati nella domanda, dove sono anche 'tuple's. L'errore è stato segnalato in un commento sulla domanda quando è stato originariamente pubblicato: 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

Se hai bisogno di 'liste' che puoi indicizzare, dovresti usare parentesi quadre' [] 'invece di parentesi per renderle delle list comprehensions invece delle espressioni del generatore. – agf

+0

-1, la soluzione con zip() è più pythonic e non ha due loop per – naeg

+7

@naeg, questa è un'espressione pythonic perfettamente corretta. Si potrebbe anche argomentare per il programmatore meno esperto questa è una soluzione migliore rispetto all'uso della sintassi 'zip (* ...)' piuttosto fasulla. – KillianDS

Problemi correlati