2016-04-24 52 views
1

我有一本看起来像这样的字典。 。 。查找字典中特定值的平均值

students_marks = {"barry": [20,25,30], "fred": [12,14,16], "sarah": [32,30,28] 

等等,我可以添加更多的键值与字典。 这些值是每个作业的标记

我试图让第一个任务中的所有学生的平均数 例如。巴里 - 20,弗雷德 - 12,萨拉 - 32

这是我到目前为止的代码

students_marks = {"barry": [20,25,30], "fred": [12,14,16], "sarah": [32,30,28]} 

def get_below_average_df_report_marks_report(): 
    sum(float(x[0] for x in students_marks.values())/len(students_marks)) 

,我发现了错误:类型错误:浮置()参数必须是一个字符串或数字,不“发电机”

回答

1

问题是,您正在试图在计算总和之前进行投射,应该是float(sum...而不是sum(float...

>>> float(sum(x[0] for x in students_marks.values()))/len(students_marks) 
21.333333333333332 

至于可读性推移,我更喜欢这种解决方案:

>>> from operator import itemgetter 
>>> first_score = itemgetter(0) 
>>> num_students = float(len(students_marks)) 
>>> sum(map(first_score, students_marks.values()))/num_students 
21.333333333333332 

如果你不想使用一个import语句的解决方案,这一个是等价的:

>>> first_score = lambda scores: scores[0] 
>>> num_students = float(len(students_marks)) 
>>> sum(map(first_score, students_marks.values()))/num_students 
21.333333333333332 

注意如果您使用Python 3,则不需要强制转换,因为/运算符默认已经执行了浮点除法。

0

你浮投已经过时:

def get_below_average_df_report_marks_report(): 
    sum((x[0] for x in students_marks.values())/len(students_marks) 

你试图发电机对象x[0] for x in students_marks.values()转换成浮动,这是不可能的,你造成的错误。

请注意,在Python 3中,您不必首先将值转换为浮点数。司总是返回一个浮点数。在Python 2中,您可以使用from __future__ import division来强制执行此行为。