2013-04-23 30 views
6

說我們在Python創建一個列表,像這樣:想找到做多列出的平均的方式

[[1, 2, 3], [1, 3, 4], [2, 4, 5]] 

然後我想3採取1+1+2和鴻溝,讓我平均爲元素並存儲在新列表中。我想再次爲第二個元素做,最後是第三個元素。如何簡潔地做到這一點? (我想不出比多環以外的方式。)

輸出應該是一個新的列表[(1+1+2), (2+3+4), (3+4+5)]

非常感謝!

+0

[平均名單蟒蛇列表](http://stackoverflow.com/questions/10919664/averaging-list-of-lists-python) – 2015-05-11 19:19:22

回答

13

平均值:

>>> data = [[1, 2, 3], [1, 3, 4], [2, 4, 5]] 
>>> from __future__ import division 
>>> [sum(e)/len(e) for e in zip(*data)] 
[1.3333333333333333, 3.0, 4.0] 

和:

>>> data = [[1, 2, 3], [1, 3, 4], [2, 4, 5]] 
>>> [sum(e) for e in zip(*data)] 
[4, 9, 12] 

返回列表元組,其中第i個元組包含來自每個參數序列或迭代的第i個元素。

時的參數已經在列表或元組,但需要解壓函數調用需要單獨的位置參數...寫的函數調用與* -operator將參數從列表或元組中解開。

>>> data 
[[1, 2, 3], [1, 3, 4], [2, 4, 5]] 

>>> zip(*data) 
[(1, 1, 2), (2, 3, 4), (3, 4, 5)] 
1
>>> l = [[1, 2, 3], [1, 3, 4], [2, 4, 5]] 
>>> zip(*l) 
[(1, 1, 2), (2, 3, 4), (3, 4, 5)] 
>>> def average(nums, default=float('nan')): 
... return sum(nums)/float(len(nums)) if nums else default 
... 
>>> [average(n) for n in zip(*l)] 
[2.0, 2.6666666666666665, 3.6666666666666665] 
+1

我想你想'的可能重複zip(* l)'在你的最後一行。否則,你只是平均每個子列表(所以你得到2,2-2/3和3-2/3而不是1-1/3,3和4)。 – abarnert 2013-04-23 00:16:11