我以前用过一个python2代码,但我想用循环代替reduce。如何重写下面的prod = reduce(lambda a, b: a * b, n)
函数?
def chineeseRemainder(n, a):
sum = 0
prod = reduce(lambda a, b: a * b, n)
for n_i, a_i in zip(n, a):
p = prod // n_i
sum += a_i * Get_Multi_Inv(p, n_i) * p
return sum % prod
通常,对于没有起始值的reduce()
,可以使用iter
和next
将其转换为for循环。这个组合允许您使用iterable的第一个元素作为起始累加器值,并在其余部分上循环
iterator = iter(n)
prod = next(iterator)
for x in iterator:
prod *= x
但在乘法的特定情况下,我们知道单位元素是1
,所以我们可以用它作为起始值,并乘以整个可迭代元素。
prod = 1
for x in n:
prod *= x
不是所有的函数都有这样的标识,但很多函数都有,比如+
的0
和min()
的math.inf
等。
您还可以添加导入
from functools import reduce
我让它工作。
def reduce(function, iterable, initializer=None):
it = iter(iterable)
if initializer is None:
value = next(it)
else:
value = initializer
for element in it:
value = function(value, element)
return value
我用把它称为上面的函数
prod = reduce(function1, n)