2015-11-23 21 views
6

mam dowolnych list, na przykład tutaj są trzy listy:Lista sortowania w Pythonie (transpozycji)

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

I chcę przenieść je ze sobą, aby uzyskać dane wyjściowe tak:

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

Jak widać, właśnie przekonwertowałem "kolumny" na "wiersze".

Kwestia jest rozwiązaniem musi być niezależna od długości list.

Na przykład:

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

Możesz zajrzeć do 'itertools.zip _longest' - To prawie wszystko, czego chcesz, po prostu trzeba odfiltrować dodatkowe dopełnienie. – mgilson

+0

@mgilson Dziękuję! Myślę, że to mi pomoże :) – Paddy

+0

Dla każdego, kto tylko wpatruje się w to pytanie i zastanawia się, jaki jest związek między danymi wejściowymi a wyjściowymi, traktuje to prawie jak transpozycję macierzy. IOW, 'f',' g' i 'h' wynikają z wykładania" a "," b "i" c "w poziomie i czytania od góry do dołu. –

Odpowiedz

11

Można wykorzystać 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] 

Jeśli None jest potencjalnym ważna wartość w wykazach, użyj Sentinel object zamiast domyślnego 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

To jest zip_longest dla python3 –

+1

@PadraicCunningham: Dobry połów - naprawiony – dawg