我尝试将以下循环转换为accumulate()
来电,但我显然失败了:
total = 0
for h in heat_values:
total += h
total -= total*0.25
如何累积h的值,包括0.25衰减因子?
背景:我想这样做是为了一个有趣的运动模拟同时加热和冷却过程的功能编程风格(添加操作是加热步骤,减法是冷却步骤)。我想得到累积值来绘制过程的值。
答案 0 :(得分:3)
除非我的数学或推理不正确,否则您将使用accumulate
实现此目的:
heatvalues = [20, 30, 40, 50]
list(accumulate(heatvalues, lambda x, y: (x+y)*.75))
>>>[20, 37.5, 58.125, 81.09375]
编辑:如果你只想要最后一个元素,也就是总数,那么它就变成了:
list(accumulate(heatvalues, lambda x, y: (x+y)*.75))[-1]
>>>81.09375
答案 1 :(得分:2)
简而言之,你没有。 累积对现有的可迭代类型(例如每日生产数量列表)进行操作,并返回其运行总数。你有一个递归关系,而不是一个可以迭代的。问题是总计取决于先前值的衰减操作。
如果你想把它作为单行,我建议你使用 reduce ,它允许你指定缩小函数 - 即 lambda 函数你自己的设计。
答案 2 :(得分:1)
functools.reduce(function, iterable[, initializer])
(只需{2.}}在2.x中)即可发挥作用。 reduce
按顺序获取两个参数,当前累计值和序列中的新值。
对于您的问题,减去.25与乘以.75相同。在添加新值之后完成。这应该有用。
function
编辑:我写了上面的内容,并没有意识到在3.2中的itertools和3.3中的from functools import reduce
def update(total, new):
return .75 * (total + new)
total = reduce(update, heat_values, 0)
参数中添加了accumulate
。 doc没有指定func
的两个参数的顺序,但它与func
函数的顺序相同:累计值new_value。这是通过使用非对称更新表达式(例如reduce
。