在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
从 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
来自 python 2 中的 itertools 模块,它们执行 zip 和 map 的操作,但惰性地使用 Python 生成器,以避免使用中间列表。在 Python 3 中,map 和 zip 内置函数是惰性的。