Ответ 1
С Python 2.5 вы можете использовать max с ключевым параметром:
>>> max(a, key=sum)
[4, 5, 6]
Какой идиоматический способ сделать 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
С Python 2.5 вы можете использовать max с ключевым параметром:
>>> max(a, key=sum)
[4, 5, 6]
Это не очень эффективно, но:
reduce(lambda x,y: x if sum(x)>sum(y) else y, [[1,2,3],[4,5,6],[1,3,5]])
Если max не имеет ключевого параметра, вы можете явно указать шаблон DSU:
max(izip(imap(sum,a),a))[1]
izip
и imap
находятся в модуле itertools в python 2 и делают то, что делают zip и map, но лениво используют генераторы Python, чтобы избежать промежуточного списка. В Python 3, карты и встроенные zip-функции являются ленивыми.