Python 使用列表理解存储最大可见值

Python 使用列表理解存储最大可见值,python,list-comprehension,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] 如果允许使用NumPy,则

是否可以通过理解列表来完成以下操作?尝试存储在循环中任何给定点处看到的最大值

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]

如果允许使用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])

如果允许使用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])
可以与Python 3中的内置项一起使用:

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]
可以与Python 3中的内置项一起使用:

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]

这里介绍的是函数式编程中称为
scan
的一种典型形式

对于低效的列表理解,一种方法是:

[max(input[:i]) for i in range(1,n+1)]
但这将在O(n2)中运行

如果使用具有副作用的函数,则可以通过列表理解来执行此操作,如下所示:

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()
如:

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]
就像我说的

但是有副作用的函数是非语法的,不是声明性的

但您最好使用
scanl
accumulate
方法,如:

从itertools导入累积

累积(输入,最大)
您在这里介绍的是函数式编程中称为
扫描的典型形式

对于低效的列表理解,一种方法是:

[max(input[:i]) for i in range(1,n+1)]
但这将在O(n2)中运行

如果使用具有副作用的函数,则可以通过列表理解来执行此操作,如下所示:

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()
如:

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]
就像我说的

但是有副作用的函数是非语法的,不是声明性的

但您最好使用
scanl
accumulate
方法,如:

从itertools导入累积

累积(输入,最大)
使用
列表(累积(…)
可以避免显式的列表理解。@DYZ Brainfart。被OP.ThanksWith
列表(累计(…)
迷住了。你可以避免显式的列表理解。@DYZ Brainfart。被OP迷住了。谢谢你不能用一个“简单”的列表理解,因为列表理解本身不会保持状态(像迄今为止看到的最高值)。只有在列表理解应用了一个维护状态的函数(如
itertools.accumulate
)或者在列表的块上而不是单个元素上运行函数(如Willem Van Onsem的O(n^2))时,才能执行此操作示例。重复项并不完全是重复项。两个问题的结构相同,但它们处理的操作不同,这是正确的。@DYZ-是的,这是重复项。您所要做的只是选择一个适当的函数,而这个问题的运算已经完成了。@TigerhawkT3我怀疑人们是否在寻找解决这个问题的方法ame问题会在那个被愚弄的目标中得到安慰。@MosesKoledoye-他们会的,除非他们(错误地)将此网站作为免费编码服务使用。你不能用“普通”列表理解来完成,因为列表理解本身不会保持状态(像迄今为止看到的最高值)。只有在列表理解应用了一个维护状态的函数(如
itertools.accumulate
)时,或者在列表的块而不是单个元素上运行函数(如Willem Van Onsem的O(n^2)时,才能执行此操作示例。重复项并不完全是重复项。两个问题的结构相同,但它们处理的操作不同,这是正确的。@DYZ-是的,这是重复项。您所要做的只是选择一个适当的函数,而这个问题的运算已经完成了。@TigerhawkT3我怀疑人们是否在寻找解决这个问题的方法ame问题会在那个被复制的目标中得到安慰。@MosesKoledoye-他们会的,除非他们(错误地)使用这个网站作为免费的编码服务。这只是一个技巧。你可以用一个
dict
c={};[c.setdefault(0,max(c.pop(0,n),n))为d中的n实现
更新和存储()
@AChampion:是的。这确实是一个聪明的方法。然而,无论如何实现具有副作用的函数,它们在列表理解、生成器等方面几乎都具有固有的危险性。因此我不建议使用它们。作为一个技巧,你可以实现
更新和存储()
带有一个
dict
c={};[c.setdefault(0,max(c.pop(0,n),n))表示d中的n]
@AChampion:是的。这确实是一种聪明的方法。然而,无论如何实现具有副作用的函数,它们在列表理解、生成器等方面的使用几乎都具有固有的危险性。因此我不建议使用它们。