15

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

这是一个 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
4

3 回答 3

41

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

>>> max(a, key=sum)
[4, 5, 6]
于 2010-05-04T05:35:08.427 回答
1

它不是非常有效,但是:

reduce(lambda x,y: x if sum(x)>sum(y) else y, [[1,2,3],[4,5,6],[1,3,5]])
于 2010-05-04T05:37:55.217 回答
1

如果 max 没有 key 参数,您可以显式编码 DSU 模式:

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

izip并且imap来自 python 2 中的 itertools 模块,执行 zip 和 map 的操作,但懒惰地使用 Python 生成器,以避免使用中间列表。在 Python 3 中,内置的 map 和 zip 是惰性的。

于 2011-05-31T21:25:32.817 回答