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:是的。这确实是一种聪明的方法。然而,无论如何实现具有副作用的函数,它们在列表理解、生成器等方面的使用几乎都具有固有的危险性。因此我不建议使用它们。