我有一個列表如下:計算相同指數的平均值在列表中,蟒蛇
A= [('1', 3), ('2', 7), ('3', 5), ('1', 7), ('2', 5), ('3', 1)]
從列表A
,我想生成輸出列表如下:
Average = [('1', 5), ('2', 6), ('3', 2)]
任何提示將非常感激! =)
我有一個列表如下:計算相同指數的平均值在列表中,蟒蛇
A= [('1', 3), ('2', 7), ('3', 5), ('1', 7), ('2', 5), ('3', 1)]
從列表A
,我想生成輸出列表如下:
Average = [('1', 5), ('2', 6), ('3', 2)]
任何提示將非常感激! =)
from collections import defaultdict
a = [('1', 3), ('2', 7), ('3', 5), ('1', 7), ('2', 5), ('3', 1)]
d = defaultdict(list)
for k, v in a:
d[k].append(v)
avg = [(k, sum(v) // len(v)) for k, v in d.iteritems()]
print avg
打印
[('1', 5), ('3', 3), ('2', 6)]
注意,此使用整數除法來計算平均值。您可能想使用浮點除法。
非常感謝您的提示! :)是的,我正在考慮如何在這裏使用浮點除法....任何提示?再次,非常感謝! :) – maria
@maria:使用'sum(v,0.0)/ len(v)'而不是'sum(v)// len(v)'。 –
@ Sven:我可以再問你一個問題嗎?當我把浮點數作爲一個值時,它不起作用。例如,>>> print result {'1':[3.2,7.3,4.2],'3':[5.2,1.6,6.3],'2':[7.7,5.1,2.5]} >>> avg = [(k,sum(v,0.0)/ len(v))in result.iteritems()] Traceback TypeError:'float'對象不可調用 – maria
在一個簡單的方法:
result = {}
for key, value in A:
result.setdefault(key, []).append(value)
print [(k, sum(v) // len(v) for k,v in result.iteritems()]
如果你總是使用'setdefault',那麼'defaultdict'肯定是要走的路。 – agf
@agf:我不同意。在這種情況下,兩個版本的代碼可讀性是相同的,而且這個版本更短更快。 –
@agf:對,假設我與python2.4及更舊版本兼容;) –
需要一行代碼。
a= [('1', 3), ('2', 7), ('3', 5), ('1', 7), ('2', 5), ('3', 1)]
map(lambda f:(f[0][0], (lambda g:sum(g)/len(g))(f[1])), map(lambda e:zip(*e), map(lambda c:filter(lambda d:d[0]==c, a), set(map(lambda b:b[0], a)))))
你的代碼很聰明,我確信寫起來很有趣,但是你會得到一個-1,以便屈從於單線程itis 。而且,這些代碼對許多人來說都是不可思議的。而且非常低效。 –
你喜歡抽象代碼和重用模式嗎?如果是這種情況,這個group
函數是您的工具集中的一個有用的模式。它類似於itertools.groupby,但它的工作原理與非連續元素和分類/在一個迭代的地圖(學分爲理念,以紅寶石刻面map_by):
def group(seq, callback=None):
result = {}
for category, item in (callback(seq) if callback else seq):
result.setdefault(category, []).append(item)
return result
average = dict((k, sum(vs)/len(vs)) for (k, vs) in group(xs).items())
print(average)
# {'1': 5.0, '3': 3.0, '2': 6.0}
你如何計算你的平均水平‘3’關鍵? –
@Cédric:我認爲這是一個錯字。任何其他值的確是平均值。 –