我有浮子兩個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的方式..)
感謝
我有浮子兩個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的方式..)
感謝
不確定更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)
>>> sum([ x*y for x,y in zip(list1,list2)])/sum(list1)
1.5642857142857143
這並沒有給出正確的答案。 – yan 2011-03-31 04:47:51
是這樣的嗎?
sum(x*y for x, y in zip(list1, list2))/sum(list1)
我不知道我會說,使用lambda是「更Python,」特別是考慮到人曾試圖減少其權力或刪除的次數它來自語言。
有幾種方法可以做到這一點。壓縮列表以便您可以使用列表理解由幾個人發佈。如果您正在尋找速度,numpy有一個點積產品功能。如果你正在尋找更簡潔的東西,你也可以做sum([lst1[i] * lst2[i] for i in range(len(lst1))])
。
這是一種方法。
>>> sum(map(lambda i: i[0]*i[1],zip(list1,list2)))/sum(list1)
1.5642857142857143
Lambda不是Pythonic。圭多不喜歡它。另外,爲什麼你有'sum(list [i])'?你想要列表*的總和*到*我嗎? – 2011-03-31 04:45:07
@Rafe - 這是值得商榷的論點。 – 2011-03-31 04:54:36
這稱爲[加權平均值](http://en.wikipedia.org/wiki/Weighted_mean),順便說一句。 – kennytm 2011-03-31 04:55:02