2010-07-11 22 views
23

dire che ho una lista Python 2D, come di seguito:Come si sommano le colonne nell'elenco 2D?

my_list = [ [1,2,3,4], 
      [2,4,5,6] ] 

posso ottenere i totali di riga con una lista di comprensione:

row_totals = [ sum(x) for x in my_list ] 

Posso ottenere i totali delle colonne senza una doppia for ciclo? Vale a dire, per ottenere questa lista:

[3,6,8,10] 

risposta

29

Usa zip

col_totals = [ sum(x) for x in zip(*my_list) ] 
+0

Mi piace perché non presuppone 2 righe. – Marty

+0

+1 zip (* mia_elenco) – Medorator

5
[x + y for x, y in zip(*my_list)] 
+1

Il * my_list è un trucco accurato. – Metalshark

+0

È molto pulito. Non l'ho mai visto prima ... – Marty

16
>>> map(sum,zip(*my_list)) 
[3, 6, 8, 10] 

O le itertools equivalenti

>>> from itertools import imap, izip 
>>> imap(sum,izip(*my_list)) 
<itertools.imap object at 0x00D20370> 
>>> list(_) 
[3, 6, 8, 10] 
+3

E abbiamo un vincitore del codice golf! – Metalshark

+0

Un mago tra noi –

7

Soluzione map(sum,zip(*my_list)) è il più veloce. Tuttavia, se è necessario mantenere l'elenco, [x + y for x, y in zip(*my_list)] è il più veloce.

Il test è stato condotto in Python 3.1.2 a 64 bit.

>>> import timeit 
>>> my_list = [[1, 2, 3, 4], [2, 4, 5, 6]] 
>>> t1 = lambda: [sum(x) for x in zip(*my_list)] 
>>> timeit.timeit(t1) 
2.5090877081503606 
>>> t2 = lambda: map(sum,zip(*my_list)) 
>>> timeit.timeit(t2) 
0.9024796603792709 
>>> t3 = lambda: list(map(sum,zip(*my_list))) 
>>> timeit.timeit(t3) 
3.4918002495520284 
>>> t4 = lambda: [x + y for x, y in zip(*my_list)] 
>>> timeit.timeit(t4) 
1.7795929868792655 
+0

Bello sapere. Grazie per aver fatto il test della velocità. – Metalshark

Problemi correlati