2011-11-07 38 views
3

我有一个列表如下:计算相同指数的平均值在列表中,蟒蛇

A= [('1', 3), ('2', 7), ('3', 5), ('1', 7), ('2', 5), ('3', 1)] 

从列表A,我想生成输出列表如下:

Average = [('1', 5), ('2', 6), ('3', 2)] 

任何提示将非常感激! =)

+2

你如何计算你的平均水平‘3’关键? –

+0

@Cédric:我认为这是一个错字。任何其他值的确是平均值。 –

回答

3
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)] 

注意,此使用整数除法来计算平均值。您可能想使用浮点除法。

+0

非常感谢您的提示! :)是的,我正在考虑如何在这里使用浮点除法....任何提示?再次,非常感谢! :) – maria

+0

@maria:使用'sum(v,0.0)/ len(v)'而不是'sum(v)// len(v)'。 –

+0

@ 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

1

在一个简单的方法:

result = {} 
for key, value in A: 
    result.setdefault(key, []).append(value) 

print [(k, sum(v) // len(v) for k,v in result.iteritems()] 
+0

如果你总是使用'setdefault',那么'defaultdict'肯定是要走的路。 – agf

+1

@agf:我不同意。在这种情况下,两个版本的代码可读性是相同的,而且这个版本更短更快。 –

+0

@agf:对,假设我与python2.4及更旧版本兼容;) –

-1

需要一行代码。

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))))) 
+0

你的代码很聪明,我确信写起来很有趣,但是你会得到一个-1,以便屈从于单线程itis 。而且,这些代码对许多人来说都是不可思议的。而且非常低效。 –

0

你喜欢抽象代码和重用模式吗?如果是这种情况,这个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}