Python reduce()函数为0

时间:2017-07-12 15:41:04

标签: python

我有vals = [1.0, 0.0, 3.4, 0.0],我想避免乘以零

如果我使用reduce(operator.mul, iterable) - 我得到0.0。

同样适用于reduce(lambda x, y : x * y, val)

如何为变量添加最小条件,使其仅大于零。但是如果数组完全没有零元素,那么它返回0.数组中的零元素不能被删除

因此vals = [1.0, 0.0, 3.4, 0.0] - 返回3.4

表示vals = [0.0, 0.0, 0.0, 0.0] - 返回0

5 个答案:

答案 0 :(得分:4)

您可以从列表中删除0。如果列表变空,则返回0,否则返回产品:

>>> no_zeroes = [value for value in values if value > 0]
>>> no_zeroes
[1.0, 3.4]
>>> reduce(lambda x, y : y*x, no_zeroes) if no_zeroes else 0
3.4

请注意,从数学的角度来看,empy列表的乘积应该是1。在这种情况下,你可以写:

reduce(lambda x, y : y*x, no_zeroes, 1)

答案 1 :(得分:2)

如果您使用numpy数组,则可以过滤掉零值:

import numpy as np
vals = np.array([0.0, 0.0, 0.0, 0.0])
no_zeros = vals[vals>0]
if no_zeros:
    print( np.prod(no_zeros))
else:
    print(0.0)

答案 2 :(得分:2)

另一种选择:

from functools import reduce

vals = [1.0, 0.0, 3.4, 0.0]
reduce(lambda x,y: y if x == 0 else (x if y == 0 else x*y), vals, 0)
# 3.4

vals = [0.0, 0.0, 0.0, 0.0]
reduce(lambda x,y: y if x == 0 else (x if y == 0 else x*y), vals, 0)
# 0.0

答案 3 :(得分:1)

只需使用filter

过滤掉0.0值
from functools import reduce

vals_without_zero = filter(lambda x: x, vals)
reduce(lambda x, y : x * y, vals_without_zero)

答案 4 :(得分:1)

合并functools.reduce(与发起人1)和filter函数:

vals = [1.0, 0.0, 3.4, 0.0]
result = functools.reduce(operator.mul, list(filter(lambda x: x>0, vals)) or [0], 1)
print(result)  #  3.4
vals = [0.0, 0.0, 0.0, 0.0]
result = functools.reduce(operator.mul, list(filter(lambda x: x>0, vals)) or [0], 1)
print(result)  # 0