是否可以使用列表理解进行以下操作?试图存储通过循环在任何给定点看到的最大值。
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]
答案 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 而不是声明。
但您最好使用scanl
或accumulate
方法,例如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])