Python 我可以向reduce函数添加迭代器吗?

Python 我可以向reduce函数添加迭代器吗?,python,iterator,reduce,Python,Iterator,Reduce,假设我有以下列表:A=[1,2,3,4],通过使用reduce函数来查找元素的乘积,我可以 prodA = reduce(lambda x,y: x*y, A) 但是,如果我有另一个列表B=[9,8,7,6],我是否仍然可以使用reduce函数执行以下操作?(从上到下指示步骤) 我不太确定是否可以在reduce函数中为listB添加迭代器之类的内容。我怎么能做到?非常感谢 这看起来像是一份工作。具体来说,我们将把这两个列表压缩在一起,然后将我们的缩减函数表示为一个接受元组而不是简单整数的函数

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

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

我不太确定是否可以在
reduce
函数中为list
B
添加迭代器之类的内容。我怎么能做到?非常感谢

这看起来像是一份工作。具体来说,我们将把这两个列表压缩在一起,然后将我们的缩减函数表示为一个接受元组而不是简单整数的函数

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

>>> 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

您的示例有些奇怪:除了第二步添加了2个术语外,其他步骤总是添加1个术语。这是个错误吗?似乎在
9
之后应该有一个步骤,即
9+1
?@John Zwinck感谢您的评论!是的,我刚刚修正了步骤:)你修正了括号,我也很想知道,但是你仍然有一个奇怪的情况,每一步中的项数是1,3,4,5,6,7,8。。。。为什么没有包含两个术语的步骤?这是一个非常容易混淆的变量名用法。您的
b
是一个元组,包含
a
中的一个元素和
b
中的一个元素!同意。我想既然西尔维奥把我揍了一顿,就没人会知道了。现在已修复。非常感谢您的回答
1
表示
x
的初始值,对吗?正确。现在必须有一个初始值,因为我们的“累加器”(
x
参数)将是一个单一的值,而我们的元素(
y
参数)是一个元组。由于它们看起来不再相同,我们需要一个显式的初始值。谢谢!!那真的很有帮助!
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