我可以使用map
和sum
来实现此功能,但如何使用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
”。
任何人都可以对此有所了解吗?
答案 0 :(得分:10)
lambda函数的第一个参数是到目前为止的总和,第二个参数是下一对元素:
value = reduce(lambda sum, (x, y): sum + x*y, zip(a, b), 0)
答案 1 :(得分:7)
我会这样做(我认为你不需要lambda)......
sum(x*y for x, y in zip(a, b))
这似乎也更明确一些。 Zip AB,乘以它们,并总结条款。
答案 2 :(得分:7)
使用reduce
和map
,
from operator import add,mul
a = [1,2,3]
b = [4,5,6]
print reduce(add,map(mul,a,b))
答案 3 :(得分: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)
答案 4 :(得分: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)
输出:array([[14,38,62],[86,110,134]])
答案 5 :(得分: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