通过元素之和寻找Python中嵌套列表的最大值

15 投票
3 回答
3417 浏览
提问于 2025-04-15 22:19

在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]

izipimap 是 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]

撰写回答