2011-03-31 21 views
1

我有浮子兩個Python列表(列表是相同的尺寸,即相同數量的元素的)Python化方式,用於計算

list1 = [20, 30, 40, 50] 
list2 = [1.1, 1.3, 1.7, 1.8] 

我想要計算sum(list1[i]*list2[i])/sum(list1[i])(其中i從0到LEN(列表1)。

這可以使用循環來完成,但有沒有更好的辦法(如使用lambda等更Python的方式..)

感謝

+1

Lambda不是Pythonic。圭多不喜歡它。另外,爲什麼你有'sum(list [i])'?你想要列表*的總和*到*我嗎? – 2011-03-31 04:45:07

+0

@Rafe - 這是值得商榷的論點。 – 2011-03-31 04:54:36

+1

這稱爲[加權平均值](http://en.wikipedia.org/wiki/Weighted_mean),順便說一句。 – kennytm 2011-03-31 04:55:02

回答

2

不確定更Python(簡單越好,對吧?),但一些更簡潔,怎麼樣:

sum(a * b for a, b in zip(list1, list2))/sum(list1) 

這主要是改編自another answer by SilentGhost

順便說一下,你正在做的第一部分(達到部門)稱爲點積。如果您已經安裝numpy,你可以這樣做:

from numpy import dot 
dot(list1, list2)/sum(list1) 
0

List comprehension:

>>> sum([ x*y for x,y in zip(list1,list2)])/sum(list1) 
1.5642857142857143 
+0

這並沒有給出正確的答案。 – yan 2011-03-31 04:47:51

0

是這樣的嗎?

sum(x*y for x, y in zip(list1, list2))/sum(list1) 
1

我不知道我會說,使用lambda是「更Python,」特別是考慮到人曾試圖減少其權力或刪除的次數它來自語言。

有幾種方法可以做到這一點。壓縮列表以便您可以使用列表理解由幾個人發佈。如果您正在尋找速度,numpy有一個點積產品功能。如果你正在尋找更簡潔的東西,你也可以做sum([lst1[i] * lst2[i] for i in range(len(lst1))])

1

這是一種方法。

>>> sum(map(lambda i: i[0]*i[1],zip(list1,list2)))/sum(list1) 
1.5642857142857143