2016-03-15 17 views
8

Considerate che ho una lista di liste come:Somma di lista multiplo di indice liste saggio

[[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]] 

Ora voglio la somma di tutti gli indici di indice di primo elenco saggi e poi la seconda lista 5+15+34=54 10+10+20=40 e così via come:

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

ho provato:

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

Qui results è l'elenco di elenchi. ma dà somma di ogni elemento della lista come:

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

Non sei sicuro di quello che si vuole: il vostro primo comma, mostra 3 liste di liste; Non capisco da dove viene il 5 + 15 + 34, davvero. – Evert

+0

5 + 15 + 34 è il primo elemento indice di tutti e 3 gli elenchi di elenchi e così via. – HunterrJ

risposta

8

Si è quasi corretta, è necessario decomprimere results e zip esso pure.

>>> 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] 

Si può semplicemente scrivere questo con la lista di comprensione come

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

Sembra che il mio commento sia stato cancellato. Grazie mille per l'aiuto @thefourtheye, dà esattamente quello che volevo. :) – HunterrJ

1

È inoltre possibile utilizzare map(), invece.

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) 

Ma questo è inutilmente lungo e la risposta di @ thefourtheye è migliore.

+0

Non sarebbe questo elenchi catenate invece di sommare gli elementi dalle liste? –

+0

Ah sì, hai ragione. Dovresti prima decomprimere le liste. –

2

Questo è molto più facile se si utilizza 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) 

uscita:

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

Allo stesso modo:

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 
Problemi correlati