2011-04-07 128 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]])