2011-04-07 61 views
9

我能够使用mapsum来实现此功能,但如何使用reducePython如何减少元组列表?

有2个列表:a,b,它们具有相同数量的值。我想计算

a[0]*b[0]+a[1]*b[1]+...+a[n]*b[n] 

使用map工作版本我写的是

value = sum(map(lambda (x,y): x*y, zip(a, b))) 

如何使用reduce呢?我写道:

value = reduce(lambda (x,y): x[0]*y[0] + x[1]*y[1], zip(a, b))) 

我得到了错误“TypeError: 'float' object is unsubscriptable”。

任何人都可以对此有所了解吗?

+1

您的lambda需要两个两元素元组。当减少列表中的前两个元素时,这很好,但是现在下一个减少将对lambda(这是一个float)和列表的下一个元素(它是一个元组)的结果起作用,并且您的lambda可以处理不了。你的lambda需要一个数字和一个元组,并且用一个初始值对这个数字进行种子处理(就像antonakos的答案一样)。 – dfan 2011-04-07 14:10:05

回答

9

lambda函数的第一个参数是总和到目前为止,第二个参数是下一对元素:

value = reduce(lambda sum, (x, y): sum + x*y, zip(a, b), 0) 
+0

真棒!谢谢!!帮助我很多! – 2016-04-15 14:14:57

+0

>>> sum(a [:] * b [:]) 也可以工作 – chrisg 2017-07-26 06:16:27

7

我会做这样(我不认为你需要拉姆达) ...

sum(x*y for x, y in zip(a, b)) 

这也似乎稍微更加明确。邮编AB,乘以它们,并总结条款。

+0

+1,尽管'sum(x * y for x,y in zip(a,b))'也可以用 – eumiro 2011-04-07 14:09:05

+0

@eumiro :的确,谢谢 – 2011-04-07 14:10:08

7

一个解决方案使用reducemap

from operator import add,mul 

a = [1,2,3] 
b = [4,5,6] 

print reduce(add,map(mul,a,b)) 
1

困难减少,当你有不正确的地图发生。

让我们来表达: value = sum(map(lambda (x,y): x*y, zip(a, b)))

地图是一个转变。我们需要它将元组转换为简单的平面的值。 在你的情况下,它看起来像:

map(lambda x: x[0]*x[1], zip(a,b)) 

然后,如果你想表达sum通过reduce - 它看起来像:

reduce(lambda x,y: x + y, map) 

所以,这里是example

a = [1,2,3] 
b = [4,5,6] 
l = zip(a,b) 
m = map(lambda x: x[0]*x[1], l) 
r = reduce(lambda x,y: x + y, m) 
0

它看起来像你想要的内在产品。使用内部产品。为载体 https://docs.scipy.org/doc/numpy/reference/generated/numpy.inner.html

np.inner(a, b) = sum(a[:]*b[:]) 

普通内积:

a = np.array([1,2,3]) 
b = np.array([0,1,0]) 
np.inner(a, b) 

输出:2

多维例如:

a = np.arange(24).reshape((2,3,4)) 
b = np.arange(4) 
np.inner(a, b) 

输出:阵列([[14,38, 62],[86,110,134]])