2015-11-23 13 views
6

ho elenchi arbitrari, per esempio, qui ci sono tre liste:Lista di smistamento in Python (trasposizione)

a = [1,1,1,1] 
b = [2,2,2,2] 
c = [3,3,3,3] 

E voglio trasporre insieme al fine di ottenere l'output come questo:

f_out = [1,2,3] 
g_out = [1,2,3] 
... 
n_out = [1,2,3] 

Come, puoi vedere, ho appena convertito "colonne" in "righe".

Il problema è che una soluzione deve essere indipendente dalla lunghezza degli elenchi.

Ad esempio:

a = [1,1] 
b = [2] 
c = [3,3,3] 
# output 
f_out = [1,2,3] 
g_out = [1,3] 
n_out = [3] 
+6

Si potrebbe voler esaminare 'itertools.zip _longest' - Quello è _almost_ cosa vuoi, devi solo filtrare il padding extra. – mgilson

+0

@mgilson Grazie! Penso che possa aiutarmi :) – Paddy

+0

Per chiunque altro fissando questa domanda e chiedendosi quale sia la relazione tra l'input e l'output, lo tratta come una matrice di trasposizione. IOW, 'f',' g' e 'h' derivano dal rivestimento' a', 'b' e' c' su in orizzontale e leggono dall'alto verso il basso. –

risposta

11

È possibile utilizzare zip_longest

>>> from itertools import zip_longest 
>>> a = [1,1] 
>>> b = [2] 
>>> c = [3,3,3] 
>>> f,g,h=[[e for e in li if e is not None] for li in zip_longest(a,b,c)] 
>>> f 
[1, 2, 3] 
>>> g 
[1, 3] 
>>> h 
[3] 

Se None è un potenziale valore valido nelle liste, utilizzare una sentinella object al posto del default None:

>>> b = [None] 
>>> sentinel = object() 
>>> [[e for e in li if e is not sentinel] for li in zip_longest(a,b,c, fillvalue=sentinel)] 
[[1, None, 3], [1, 3], [3]] 
+2

È zip_longest per python3 –

+1

@PadraicCunningham: buona cattura - risolto – dawg