Python如何减少多个列表?

问题描述 投票:10回答:5

我可以使用 mapsum 来实现这个功能,但如何使用 reduce?

有两个名单。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".

谁能给我一些启示?

python sum reduce map-function
5个回答
10
投票

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

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

7
投票

我会这样做(我认为你不需要lambda)... ...

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

这似乎也稍微明确了一些。Zip AB,将它们相乘,然后将各项相加。


7
投票

一个使用 reducemap,

from operator import add,mul

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

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

1
投票

当你的地图不正确时,就会出现reduce的困难。

让我们以表达式为例。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)

所以,这里是 例子:

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)

1
投票

看起来你需要一个内部产品,使用一个内部产品。https:/docs.scipy.orgdocnumpyreferencegeneratednumpy.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]])

© www.soinside.com 2019 - 2024. All rights reserved.