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
函数中为listB
添加迭代器之类的内容。我怎么能做到?非常感谢 这看起来像是一份工作。具体来说,我们将把这两个列表压缩在一起,然后将我们的缩减函数表示为一个接受元组而不是简单整数的函数
将我们的列表压缩在一起可以让我们
>>> 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