通过Python中的元素总和查找列表列表的最大值

时间:2010-05-04 05:32:30

标签: python list haskell higher-order-functions

在列表列表中,maximumBy(更高阶函数采用测试的比较函数)的惯用方法是什么?在Python中,我们要做的比较是列表的总和?

这是一个Haskell实现和示例输出:

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

这些基础库函数的实现,只是为了完整性(如果你想使用reduce或者其他东西:)。

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

3 个答案:

答案 0 :(得分:42)

从Python 2.5开始,您可以将max与关键参数一起使用:

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

答案 1 :(得分:1)

效率不高,但是:

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

答案 2 :(得分:1)

如果max没有关键参数,您可以明确编码DSU模式:

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

izipimap来自python 2中的itertools模块并执行zip和map的操作,但是懒得使用Python生成器,以避免使用中间列表。在Python 3中,map和zip builtins是懒惰的。