Поиск максимального списка списков по сумме элементов в Python

Какой идиоматический способ сделать maximumBy (функция более высокого порядка, использующая функцию сравнения для теста), в списке списков, где сравнение, которое мы хотим сделать, это сумма списка в Python?

Здесь вывод реализации и примера Haskell:

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

И реализации этих базовых библиотечных функций, только для полноты (в случае, если вы хотите использовать сокращение или что-то еще:)

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

Ответы

Ответ 1

С Python 2.5 вы можете использовать max с ключевым параметром:

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

Ответ 2

Это не очень эффективно, но:

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

Ответ 3

Если max не имеет ключевого параметра, вы можете явно указать шаблон DSU:

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

izip и imap находятся в модуле itertools в python 2 и делают то, что делают zip и map, но лениво используют генераторы Python, чтобы избежать промежуточного списка. В Python 3, карты и встроенные zip-функции являются ленивыми.