2016-03-15 10 views
8

Rozważmy Mam listę list jako:Suma stwardnienie liście indeksu list mądry

[[5, 10, 30, 24, 100], [1, 9, 25, 49, 81]] 
[[15, 10, 10, 16, 70], [10, 1, 25, 11, 19]] 
[[34, 20, 10, 10, 30], [9, 20, 25, 30, 80]] 

Teraz chcę sumę wszystkich indeksów indeks pierwszej listy jest mądry, a następnie 2nd listy 5+15+34=54 10+10+20=40 i tak dalej jako:

[54,40,50, 50,200], [20,30,75,90,180] 

próbowałem:

for res in results:  
    print [sum(j) for j in zip(*res)] 

Tutaj results to lista list. Ale daje sumę każdego elementu listy jako:

[6,19,55,73,181] 
[25,11,35,27,89] 
[43,40,35,40,110] 
+0

Nie wiesz, co chcesz: Twój pierwszy akapit pokazuje 3 wykazy listy; Nie rozumiem, skąd naprawdę pochodzi 5 + 15 + 34. – Evert

+0

5 + 15 + 34 jest pierwszym elementem indeksu wszystkich 3 list list i tak dalej. – HunterrJ

Odpowiedz

8

Jesteś prawie poprawne, trzeba rozpakować results i ZIP równie dobrze.

>>> data = [[[5, 10, 30, 24, 100], [1, 9, 25, 49, 81]], 
...   [[15, 10, 10, 16, 70], [10, 1, 25, 11, 19]], 
...   [[34, 20, 10, 10, 30], [9, 20, 25, 30, 80]]] 
>>> for res in zip(*data): 
...  print [sum(j) for j in zip(*res)] 
... 
[54, 40, 50, 50, 200] 
[20, 30, 75, 90, 180] 

można po prostu napisać to z listowego jako

>>> [[sum(item) for item in zip(*items)] for items in zip(*data)] 
[[54, 40, 50, 50, 200], [20, 30, 75, 90, 180]] 
+0

Wygląda na to, że mój komentarz został usunięty. Wielkie dzięki za pomoc @thefourtheye, daje dokładnie to, co chciałem. :) – HunterrJ

1

Można również użyć map() zamiast.

a = [[5, 10, 30, 24, 100], [1, 9, 25, 49, 81]] 
b = [[15, 10, 10, 16, 70], [10, 1, 25, 11, 19]] 
c = [[34, 20, 10, 10, 30], [9, 20, 25, 30, 80]] 
results = [] 
for i in range(0, max(len(a), len(b), len(c))): 
    results.append(map(lambda x, y, z: x + y + z, a[i], b[i], c[i])) 

for result in results: 
    for i in result: 
     print(i) 

Ale to jest niepotrzebnie długie i odpowiedź @fasetheye jest lepsza.

+0

Czy to nie catenate zamiast sumować elementy z list? –

+0

Ach tak, masz rację. Najpierw musisz rozpakować listy. –

2

Jest to o wiele łatwiejsze, jeśli używasz Numpy:

import numpy as np 

data = [[[5, 10, 30, 24, 100], [1, 9, 25, 49, 81]], 
     [[15, 10, 10, 16, 70], [10, 1, 25, 11, 19]], 
     [[34, 20, 10, 10, 30], [9, 20, 25, 30, 80]]] 

a = np.array(data) 
print a.sum(axis=0) 

wyjściowa:

[[ 54, 40, 50, 50, 200], 
[ 20, 30, 75, 90, 180]] 

Podobnie:

In [5]: a.sum(axis=1) 
Out[5]: 
array([[ 6, 19, 55, 73, 181], 
     [ 25, 11, 35, 27, 89], 
     [ 43, 40, 35, 40, 110]]) 

In [6]: a.sum(axis=2) 
Out[6]: 
array([[169, 165], 
     [121, 66], 
     [104, 164]]) 

In [7]: a.sum() 
Out[7]: 789