通过元素之和寻找Python中嵌套列表的最大值
在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
3 个回答
1
如果 max 函数没有 key 参数,你可以直接写出 DSU 模式的代码:
max(izip(imap(sum,a),a))[1]
izip
和 imap
是 Python 2 中 itertools 模块里的函数,它们的功能和 zip 以及 map 一样,但它们是懒加载的,也就是说它们不会一次性生成一个中间列表,而是使用 Python 的生成器来逐个处理。在 Python 3 中,map 和 zip 函数本身就是懒加载的。
1
这不是特别高效,但:
reduce(lambda x,y: x if sum(x)>sum(y) else y, [[1,2,3],[4,5,6],[1,3,5]])
41
从Python 2.5开始,你可以使用max函数,并且可以加一个叫做key的参数:
>>> max(a, key=sum)
[4, 5, 6]