2012-10-20 138 views
5

的我的形式的字典:平均元组

{"a":(1, 0.1) , "b":(2, 0.2) , ...} 

每个括号是对应于(得分,标准偏差)的元组。 我如何取每个元组中的第一个整数的平均值? 我已经试过这样:

for word in d: 
    (score, std) = d[word] 
    d[word]=float(score),float(std) 
    if word in string: 
     number = len(string) 
     v = sum(score) 
     return (v)/number 

得到这个错误:

v = sum(score) 
TypeError: 'int' object is not iterable 

回答

7

很容易使用list comprehensions做。首先,您可以从d.values()获取所有字典值。要列出每个值中的第一项,请列出一个列表,如[v[0] for v in d.values()]。然后,只需把这些元素的总和,除以在字典中的项目数:

sum([v[0] for v in d.values()])/float(len(d)) 

至于佩德罗正确地指出,这实际上创建列表,然后做的总和。如果你有一本巨大的字典,这可能会占用大量内存并且效率低下,所以你需要一个generator expression而不是一个列表理解。在这种情况下,只是意味着摆脱一对括号的:

sum(v[0] for v in d.values())/float(len(d)) 

这两种方法进行了比较in another question

+2

你实际上并不需要列表理解,sum会采用任何可迭代的方式,所以在sum(v [0] for v in d.values())中的生成器表达式将不会创建中间列表。 –

+0

优秀点。我只是认为建立这样的表达更清楚一些。 – Mike