使用列表推导来存储最大值

时间:2017-04-01 22:34:32

标签: python list-comprehension

是否可以使用列表理解进行以下操作?试图存储通过循环在任何给定点看到的最大值。

def test(input):
    a = input[0]
    b = []
    for i in input:
        a = max(i,a)
        b.append(a)
    return b

print test([-5,6,19,4,5,20,1,30])

# returns [-5, 6, 19, 19, 19, 20, 20, 30]

3 个答案:

答案 0 :(得分:5)

您可以将itertools.accumulate与Python 3中内置的max一起使用:

from itertools import accumulate

lst = [-5,6,19,4,5,20,1,30]
r = list(accumulate(lst, max)) #[i for i in accumulate(lst, max)]
print(r)
# [-5, 6, 19, 19, 19, 20, 20, 30]

答案 1 :(得分:4)

您在此处介绍的是函数式编程scan已知的典型形式。

使用效率低下列表理解执行此操作的方法是:

[max(input[:i]) for i in range(1,n+1)]

但这将在 O(n 2 中运行。

您可以使用列表理解来执行此操作使用带副作用的函数:如下所示:

def update_and_store(f,initial=None):
    cache = [initial]
    def g(x):
       cache[0] = f(cache[0],x)
       return cache[0]
    return g

然后您可以使用:

h = update_and_store(max,a[0])
[h(x) for x in a]

或者您可以使用像setdefault()这样的dictonaries:

def update_and_store(f):
    c = {}
    def g(x):
        return c.setdefault(0,f(c.pop(0,x),x))
    return g

并将其命名为:

h = update_and_store(max)
[h(x) for x in a]

就像@AChampion所说的那样。

副作用的功能是 unpythonic 而不是声明

但您最好使用scanlaccumulate方法,例如itertools提供的方法:

from itertools import accumulate

accumulate(input,max)

答案 2 :(得分:3)

如果允许使用NumPy,则可以使用NumPy:

import numpy as np
np.maximum.accumulate([-5,6,19,4,5,20,1,30])
# array([-5,  6, 19, 19, 19, 20, 20, 30])