2010-07-11 28 views
23

Nói rằng tôi đã là một danh sách Python 2D như sau:Làm cách nào để tổng hợp các cột trong danh sách 2D?

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

tôi có thể nhận được tổng số hàng với một danh sách hiểu:

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

Tôi có thể nhận được tổng số cột mà không có một for vòng đôi? Ví dụ, để có được danh sách này:

[3,6,8,10] 

Trả lời

29

Sử dụng zip

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

Tôi thích điều này vì nó không giả định 2 hàng. – Marty

+0

+1 zip (* my_list) – Medorator

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

* my_list là mẹo nhỏ gọn. – Metalshark

+0

Nó rất gọn gàng. Chưa bao giờ thấy nó trước đây ... – Marty

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

Hoặc itertools tương đương

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

Và chúng tôi có một người chiến thắng gôn mã! – Metalshark

+0

Một thuật sĩ trong số chúng tôi –

7

Giải pháp map(sum,zip(*my_list)) là nhanh nhất. Tuy nhiên, nếu bạn cần giữ lại danh sách, [x + y for x, y in zip(*my_list)] là nhanh nhất.

Thử nghiệm được thực hiện bằng Python 3.1.2 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

Rất vui được biết. Cảm ơn bạn đã thực hiện kiểm tra tốc độ. – Metalshark

Các vấn đề liên quan