2012-02-29 36 views
9

Gần nhất là summing columns.Làm cách nào để tổng hợp một mảng đa chiều trong python gọn gàng nhất?

Vì vậy, tôi sẽ làm điều gì đó tương tự như trong câu hỏi của tôi:

Nói rằng tôi đã là một danh sách Python 2D như sau:

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 sự hiểu biết danh sách:

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

Trong một dòng, làm cách nào tôi có thể tổng hợp toàn bộ mảng 2d?

27 

Trả lời

11

Bạn có thể làm dễ dàng như

sum(map(sum, my_list)) 

hoặc cách khác

sum(sum(x) for x in my_list)) 

và gọi nó là một ngày, nếu bạn không mong đợi hơn 2 chiều. Lưu ý rằng giải pháp đầu tiên có nhiều khả năng không phải là giải pháp nhanh nhất (như trong thời gian thực hiện), do việc sử dụng map(). Điểm chuẩn và so sánh khi cần thiết.

Cuối cùng, nếu bạn thấy mình sử dụng mảng đa chiều, hãy xem xét sử dụng NumPy và các hàm thân thiện với mảng cao cấp của nó. Dưới đây là một đoạn trích ngắn cho vấn đề của bạn:

import numpy as np 

my_list = np.array([[1,2,3,4], [2,4,5,6]]) 
np.sum(my_list) 

Điều này sẽ phù hợp với bất kỳ số thứ nguyên nào mà mảng của bạn có thể có.

+0

'bản đồ' không phải là chậm. – Marcin

+0

@Marcin trong Python 2.x. – katrielalex

+0

@katrielalex: Những con số không đồng ý với bạn: http://ideone.com/4RXfR vs http://ideone.com/6tOEJ – Marcin

3
>>> sum ([ sum(x) for x in [[1,2,3,4], [2,4,5,6]] ]) 
27 
+0

Sử dụng một máy phát điện không phải là một danh sách hiểu ('()' không '[]'). – katrielalex

+0

@ katrielalex: bạn đúng, cũng như có trí nhớ. Tôi lấy mã OP để kiểm tra, sau đó quên xóa các ô vuông. – CapelliC

3

Một giải pháp sử dụng itertools:

>>> from itertools import chain 
>>> my_list = [ [1,2,3,4], [2,4,5,6] ] 
>>> sum(chain(*my_list)) 
27 
1
>>> from itertools import chain 
>>> my_list = [[1,2,3,4], [2,4,5,6]] 
>>> sum(chain.from_iterable(my_list)) 
27 
0

Bạn có thể sử dụng tiền để đầu thêm danh sách bên nhau và sau đó tổng hợp các kết quả danh sách dẹt:

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

>>> sum(my_list, []) 
[1, 2, 3, 4, 2, 4, 5, 6] 

>>> sum(sum(my_list, [])) 
27 
+0

Câu trả lời của bạn có thêm bất kỳ thứ gì lên các câu trả lời khác ở đây không? – rayryeng

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