2012-10-22 20 views
11

Jaki jest najlepszy sposób na zsumowanie dwóch lub więcej list, nawet jeśli mają one różne długości?Listy sum o różnych długościach

Na przykład mam:

lists = [[1, 2], [0, 3, 4], [5]] 

a wynik powinien być:

result = [6, 5, 4] 
+0

'Wyzwanie dla najbardziej pytonicznej drogi jest nadal otwarte. - co jest tak niepytonnego w odniesieniu do' izip_longest'? –

+1

Nic, to tylko otwarte pytanie, bez jednej poprawnej odpowiedzi. Pytanie miało na celu zebranie wielu sposobów wykonania tego zadania, aby nauczyć się nowych metod rozwiązania problemu. –

+0

To nie jest pytanie, które pasuje do stackoverflow. Prawdopodobnie zostaniesz oznaczony jako "niestrudzony". –

Odpowiedz

18

Można użyć itertools.izip_longest() i użyć fillvalue równą 0

In [6]: [sum(x) for x in itertools.izip_longest(*lists, fillvalue=0)] 
Out[6]: [6, 5, 4] 

dla Pythona < 2.6:

In [27]: ml = max(map(len, lists)) 

In [28]: ml  #length of the longest list in lists 
Out[28]: 3 

In [29]: [sum(x) for x in zip(*map(lambda x:x+[0]*ml if len(x)<ml else x, lists))] 
Out[29]: [6, 5, 4] 
+1

(pod warunkiem, że użytkownik nie utknął w Pythonie <2.6) –

0

Najlepszym wymyśliłem jest następujący:

result = [sum(filter(None, i)) for i in map(None, *lists)] 

To nie jest tak źle, ale muszę dodać NoneTypes a następnie filtrować je w celu podsumowania.

Powiązane problemy