微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决我可以向reduce函数添加迭代器吗?

假设我有以下列表: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],1)
print(r) # 370

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。