我有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
答案 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
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