我可以在 reduce 函数中添加一个迭代器吗?

Can I add an iterator to the reduce function?

假设我有以下列表:A = [1,2,3,4],通过使用 reduce 函数,要找到元素的乘积,我可以做

prodA = reduce(lambda x,y: x*y, A)

但是,如果我有另一个列表B=[9,8,7,6],我是否仍然可以使用reduce函数来执行以下操作? (从上到下表示步骤)

9
(9+1)* 2
((9+1) *2)+8
(((9+1) *2)+8)*3
((((9+1) *2)+8)*3)+7
(((((9+1) *2)+8)*3)+7)*4
((((((9+1) *2)+8)*3)+7)*4)+6

我不太确定是否可以将列表 B 的迭代器之类的东西添加到 reduce 函数中。我该怎么做?非常感谢!

这看起来像是 zip 的工作。具体来说,我们将把两个列表压缩在一起,然后将我们的归约函数表示为一个函数,该函数采用元组而不是简单的整数。

将我们的列表压缩在一起可以得到

>>> list(zip(A, B))
[(1, 9), (2, 8), (3, 7), (4, 6)]

并且您的函数在每一步都乘以 A 的一个元素,然后添加 B 的一个元素。所以,从 1 开始(这是一个明智的默认值,因为我们做的第一件事就是乘法,所以 1 将是第一个操作的标识),乘以元组的第一个元素,然后添加第二个。

reduce(lambda x, y: x * y[0] + y[1], zip(A, B), 1)

然后,根据您的输入,我们得到 370,等于

((((9+1)*2)+8)*3+7)*4+6

您可以使用 zip 作为输入并使用 1 作为初始值:

from functools import reduce

A = [1,2,3,4]
B = [9,8,7,6]

r = reduce(lambda r,ab: r*ab[0]+ab[1],zip(A,B),1)
print(r) # 370