2010-05-04 56 views
15

Cách thành ngữ để làm maximumBy (hàm bậc cao hơn lấy hàm so sánh cho thử nghiệm), trên danh sách danh sách, nơi so sánh chúng tôi muốn thực hiện là tổng của danh sách, bằng Python?Tìm tối đa danh sách các danh sách theo tổng các phần tử trong Python

Dưới đây là một Haskell thực hiện và dụ đầu ra:

> maximumBy (compare `on` sum) [[1,2,3],[4,5,6],[1,3,5]] 
> [4,5,6] 

Và triển khai những chức năng thư viện cơ sở, chỉ cho đầy đủ (trong trường hợp bạn muốn sử dụng làm giảm hoặc một cái gì đó :)

maximumBy cmp xs = foldl1 maxBy xs 
    where 
     maxBy x y = case cmp x y of GT -> x; _ -> y 

k `on` f = \x y -> f x `k` f y 

sum  = foldl' (+) 0 

Trả lời

42

Kể từ Python 2.5 bạn có thể sử dụng max với thông số chính:

>>> max(a, key=sum) 
[4, 5, 6] 
+0

Giải pháp tuyệt vời! Haha! –

+3

+1. Ngắn gọn, rõ ràng và chính xác. Rất nhiệt tình. –

+1

max (a) có vẻ giống như vậy. – titaniumdecoy

1

Nó không phải là terribly hiệu quả, nhưng:

reduce(lambda x,y: x if sum(x)>sum(y) else y, [[1,2,3],[4,5,6],[1,3,5]]) 
+0

So sánh điều này với câu trả lời chính xác của @ Mark là một cách thú vị để cho thấy lý do tại sao các lập trình viên Python sẽ là tốt nhất hết _forgetting_ về 'giảm' (điều tốt nó không được xây dựng trong bất kỳ chi tiết trong Py3! -). –

+6

@ Alex: Nếu ai đó đã đăng câu trả lời bằng cách sử dụng vòng lặp, điều này cũng sẽ trở nên vụng về hơn câu trả lời của Mark, bạn có cho rằng các lập trình viên python tốt hơn là quên đi các vòng lặp không? – sepp2k

+2

@ sepp2k: các vòng lặp 'for' là một cách thú vị để hiển thị lý do tại sao các lập trình viên Python nên sử dụng tính năng hiểu danh sách. Trong tất cả sự nghiêm túc, không phải lúc nào cũng có một sự thay thế cho một vòng lặp 'for', nhưng đó thường không phải là trường hợp cho' reduce'. Giống như cá nhân tôi thích bộ ba 'map' /' filter'/'reduce', Alex nói đúng là thường có cách tốt hơn. – outis

1

Nếu max không có thông số quan trọng bạn có thể mã mô hình DSU một cách rõ ràng:

max(izip(imap(sum,a),a))[1] 

izipimap là từ các module itertools trong python 2 và làm những gì zip và bản đồ làm, nhưng lười biếng bằng cách sử dụng máy phát điện Python, để tránh consing một danh sách trung gian. Trong Python 3, bản đồ và zip được xây dựng là lười biếng.

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