gpt4 book ai didi

python - 将列表中的每个值设置为前一个值的某种修改?

转载 作者:行者123 更新时间:2023-11-30 22:42:14 25 4
gpt4 key购买 nike

假设我们有一个随机整数列表

我想获得一个新列表(或就地更改此列表),其中每个元素要么是其本身,要么是前一个元素 *2(以较大者为准)

一种方法是:

a = [-1, 0, 5, -2, 1]

for i in range(1:len(a)):
a[i] = max(a[i], a[i-1] * 2)

#result should be [-1, 0, 5, 10, 20]

但是,有没有一些创造性的方法可以在一行中完成此操作?是否可以巧妙地使用 lambda、map 或 iterator 之类的东西来获得相同的结果?

我尝试使用 zip 创建每个值和前一个值的对,但是一旦我们更改一个元素,zip 的其余部分就毫无用处,因为这些值也不会更改。

最佳答案

在Python3中:

a = [-1, 0, 5, -2, 1]
list(itertools.accumulate(a, lambda acc, x: max(2 * acc, x))
>>> [-1, 0, 5, 10, 20]

不过,Python 2 的运气就没那么好运了:

def agg(acc, x):
return acc + [max(2 * acc[-1], x)]
reduce(agg, a[1:], a[0:1])
>>> [-1, 0, 5, 10, 20]

您可以对哨兵进行一些修改,使其使用起来更愉快:

def agg(acc, x):
return acc + [max(2 * acc[-1], x)] if acc else [x]
reduce(agg, a, None)
>>> [-1, 0, 5, 10, 20]

这种“滥用”reduce() 的(有时)好处是 acc 拥有迄今为止的完整转换历史记录。

关于python - 将列表中的每个值设置为前一个值的某种修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42212868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com