Python减少功能

时间:2018-06-21 23:50:07

标签: python lambda reduce

我只是在学习Python,并且不了解我从reduce函数获得的行为。我看过很多例子,当您想相乘时,可以使用reduce来执行等效的求和运算:

f = [2,3,4]
reduce(lambda x,y: x*y,f)

那给了我我期望的价值。但是我需要乘以所有的倒数。我以为我可以做到:

reduce(lambda x,y: 1/x * 1/y, f)

但是它是1.5,而不是一些小得多的十进制答案。我在做什么错了?

1 个答案:

答案 0 :(得分:4)

每个调用中的x是最后一个调用的结果(它只是第一次调用时的直接输入之一),因此每次执行1 / x都会取前一个结果的倒数。要解决此问题,您需要更改lambda,使其仅乘以新数字的倒数,而不是累加值。您还需要提供一个初始中性值(1),以使f中的第一个值正确地取其倒数(否则,它将是f[0]的纯值乘以f[1:]的倒数:

# x is accumulated product of reciprocals to date, *DON'T* take reciprocal again
reduce(lambda x, y: x * (1 / y), f, 1)
                                  # ^ multiplicative identity is correct neutral value here

也就是说,您可以进一步简化; x * (1 / y)x / y(大致上存在浮点精度问题)等效,因此您可以进一步简化为:

reduce(lambda x, y: x / y, f, 1)

或使用the operator module将所有工作推送到C层(仅在f可能真的很大时才重要):

import operator
reduce(operator.truediv, f, 1)

无论哪种方式,都会得到预期的结果:

>>> (1/2) * (1/3) * (1/4)
0.041666666666666664
>>> reduce(lambda x,y: x * (1 / y), f, 1)
0.041666666666666664
>>> reduce(lambda x,y: x / y, f, 1)
0.041666666666666664
>>> reduce(operator.truediv, f, 1)
0.041666666666666664