您需要的是map和reduce:>>> from functools import reduce
>>> yourlist = [2, 3]
>>> reduce(lambda x, y: x*y, map(lambda x: (1-1/x), yourlist))
0.33333333333333337
>>> yourlist = [2, 3, 5]
>>> reduce(lambda x, y: x*y, map(lambda x: (1-1/x), yourlist))
0.2666666666666667
因为map将每个项转换为(1-1/item),然后reduce将它们全部相乘。在
附加说明:
您还可以使用更快的^{}代替lambda x, y: x * y,例如:
^{pr2}$
感谢@acushner指出这一点(在评论中)。在
你的功能出了什么问题
在这种情况下,很容易看出什么不起作用,只需使用一个命名函数并添加一些prints:def myfunc(x, y):
print('x = {}'.format(x))
print('y = {}'.format(y))
res = (1 - 1.0/x) * (1 - 1.0/y)
print('res = {}'.format(res))
return res
reduce(myfunc, [2, 3])
# x = 2
# y = 3
# res = 0.33333333333333337
reduce(myfunc, [2, 3, 5])
# x = 2
# y = 3
# res = 0.33333333333333337
# x = 0.33333333333333337
# y = 5
# res = -1.5999999999999996
所以它使用最后一个结果作为“next”x值。这就是为什么它适用于length-2-list的情况,但是对于更多的元素,它并没有应用您想要的公式。在
备选方案
您还可以使用一个简单的for循环,而不是使用map和reduce循环。把它们弄对要容易得多,而且大多数时候它们更具可读性(在某些情况下,它比reduce更快)。在prod = 1
for item in yourlist:
prod *= 1 - 1 / item
print(prod)
是的,现在它不是1行,而是4行长,但是很容易理解发生了什么(但是可能有一些边缘情况,它的行为不像reduce,例如对于空输入)。在
但我通常更喜欢简单的循环而不是复杂的reduce-操作,但总是YMMV。:)