11

我能够使用mapsum实现此功能,但如何使用reduce

有 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”。

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

4

6 回答 6

8

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

value = reduce(lambda sum, (x, y): sum + x*y, zip(a, b), 0)
于 2011-04-07T14:04:28.520 回答
8

使用reduce和的解决方案map

from operator import add,mul

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

print reduce(add,map(mul,a,b))
于 2011-04-07T14:12:29.157 回答
7

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

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

这似乎也更加明确。压缩 AB,将它们相乘,然后总结这些术语。

于 2011-04-07T14:05:05.727 回答
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)

所以,这里是例子

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)
于 2015-07-02T12:35:30.503 回答
1

看起来你想要一个内积。使用内积。 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]])

于 2017-07-26T06:15:16.663 回答
1

接受答案更新(@antonakos):

在Python 3 .x中删除了解压元组参数的能力

所以解决方案

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

可能会给你一个语法错误:

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

要同时在Python 2.x 和 3.x上工作,您可以手动解压缩元组

from functools import reduce
a = [1,2,3]
b = [1,4,8]
value = reduce(lambda sum, xy: sum + xy[0]+xy[1], zip(a,b), 0)
print("result:", value)

结果:19

于 2021-02-02T12:36:53.910 回答