2015-06-06 52 views
-3

我有以下的解释:Python 3.4 - 如何获得字典值的平均值?

StudentGrades = { 
    'Ivan': [4.32, 3, 2], 
    'Martin': [3.45, 5, 6], 
    'Stoyan': [2, 5.67, 4], 
    'Vladimir': [5.63, 4.67, 6] 
} 

我想打一个打印学生成绩的平均值的函数,即值的平均值,但我不知道怎么样。你能帮我吗?

+0

你尝试过什么了吗? – IanAuld

+0

访问每个键的值,将其相加除以项目数,然后打印结果。 – MattDMo

+1

你知道如何遍历字典中的匹配键和值吗?你知道如何取平均值吗?你知道如何打印一些东西吗?这些问题中的每一个都在SO上多次提出并回答。通过结合他们,你可以做你需要的东西 - 如果你仍然有问题,你的问题可以变得非常具体和具体。 – DSM

回答

6

好了,让我们遍历所有字典键和平均项目:

avgDict = {} 
for k,v in StudentGrades.iteritems(): 
    # v is the list of grades for student k 
    avgDict[k] = sum(v)/ float(len(v)) 

现在你可以看到:

avgDict 
Out[5]: 
{'Ivan': 3.106666666666667, 
'Martin': 4.816666666666666, 
'Stoyan': 3.89, 
'Vladimir': 5.433333333333334} 

从你的问题我觉得你很想吐关于迭代字典,所以这里的输出和列表一样:

avgList = [] 
for k,v in StudentGrades.iteritems(): 
    # v is the list of grades for student k 
    avgDict.append(sum(v)/ float(len(v))) 

但要小心:字典中的项目顺序是不保证;这是,在字典上打印或迭代时键/值的顺序不能保证(因为字典是“未排序的”)。 尽管循环遍历相同的相同字典对象(不带添加/删除)两次,但保证其行为相同。

0
from scipy import mean 
map(lambda x: mean(StudentGrades[x]), StudentGrades) 

生成的输出:

[3.1066666666666669, 
3.8900000000000001, 
5.4333333333333336, 
4.8166666666666664] 

如果你喜欢一个非SciPy的解决方案一个可以使用sumlen像应该由Jiby:

map(lambda x: sum(StudentGrades[x])/len(StudentGrades[x]), StudentGrades) 

编辑:我非常抱歉,我忘了你想要一个Python 3.4解决方案,因此(因为你会得到一个地图对象返回),你需要的,例如附加列表命令:

from scipy import mean 
list(map(lambda x: mean(StudentGrades[x]), StudentGrades)) 

这将返回所需的输出。

+0

不错的oneliner,但加载scipy一个简单的字典? ^^ – Jiby

+0

是的,加载整个scipy可能不是那么好,如果你真的只需要这一种方法......但正如我的编辑显示,你可以加载只是意味着...我不认为这会是一个问题。 – daniel451

+0

真^^。 另外:元素的顺序取决于字典如何迭代(这取决于实现) – Jiby

1

如果你不想做简单的计算使用statistics.mean:

from statistics import mean 

StudentGrades = { 
    'Ivan': [4.32, 3, 2], 
    'Martin': [3.45, 5, 6], 
    'Stoyan': [2, 5.67, 4], 
    'Vladimir': [5.63, 4.67, 6] 
} 

for st,vals in StudentGrades.items(): 
    print("Average for {} is {}".format(st,mean(vals)))