因此,我们的建议是创建一个函数,该函数将输入分数〜(一个N×M矩阵,其中包含给M个不同作业的N个学生的7步尺度的分数),并计算成绩Final(长度为n的向量,包含N名学生的最终成绩。)。
对于每个学生,必须按照以下方式计算最终成绩:
如果只有一个作业(M = 1),则最终成绩等于该作业的成绩。
如果有两个或多个作业(M> 1),则最低成绩将被丢弃。最终分数的计算方法是将M − 1个最高分数的平均值四舍五入到刻度上最接近的分数(使用roundGrade函数)。
不管以上哪种情况,如果学生在一项或多项作业中获得的分数为-3,则最终分数必须始终为-3。
我在下面插入了roundGrade函数,但是当我尝试运行矩阵时,我收到了。“ TypeError: unsupported operand type(s) for /: 'NoneType' and 'int'
”。这意味着我可能完全误解了一些东西。
import numpy as np
def computeFinalGrades(grades):
if len(grades)==1:
gradesFinal = grades
elif len(grades)>=2:
trimmed = grades.remove(min(grades))
finalgrade = np.mean(trimmed)
gradesFinal = roundGrade(finalgrade)
elif grades[grades==-3]:
gradesFinal= -3
return gradesFinal
def roundGrade(grades):
grade_groups = [-3,0,2,4,7,10,12]
gradesRounded = [min(grade_groups,key=lambda x:abs(grade-x)) for grade in grades]
return gradesRounded
我感谢您的帮助,也欢迎向我展示一种更智能的方法。
大概有5个方面,其需要在原代码被改变:压痕,list.remove
,if
/elif
订单,价值的存在是为了在列表和通过列表的检查方式roundGrade()
的功能。
1.缩进
首先,您的缩进不正确。python解释器将缩进考虑在内,这一点很重要。在每个if语句之后,您应针对该特定条件缩进代码块。除此之外,还应确保if和elif处于相同的缩进级别。因此它应该看起来像这样。
import numpy as np
def computeFinalGrades(grades):
if len(grades)==1:
gradesFinal = grades
elif len(grades)>=2:
trimmed = grades.remove(min(grades))
finalgrade = np.mean(trimmed)
gradesFinal = roundGrade(finalgrade)
elif grades[grades==-3]:
gradesFinal= -3
return gradesFinal
def roundGrade(grades):
grade_groups = [-3,0,2,4,7,10,12]
gradesRounded = [min(grade_groups,key=lambda x:abs(grade-x)) for grade in grades]
return gradesRounded
2. list.remove返回无
其次,假设您要将列表传递给computeFinalGrades,那么grades.remove intrimmed = grades.remove(min(grades))
会在适当位置修改成绩列表并返回None
。因此,当您在其上调用函数roundGrade时,会出现NoneType错误。
3. if / elif块的顺序
第三,if块的流程是错误的。考虑将数组[1,2,3,4,5,-3]传递到的情况computeFinalGrades([1,2,3,4,5,-3])
,然后if语句if len(grades)==1
将返回True,并且评估将在此处停止。相反,您应该移至grades[grades==-3]
顶部,成为要评估的第一个语句,因为一旦此语句为true,则应始终返回-3。
4.检查列表中的值
第四,grades[grades==-3]
首先评估变量grades是否指向-3,这又返回false,因为grades始终是列表,而不是整数-3。在这一点上,您grades[False]
将得到同等的对待,grades[0]
因此您总是会得到第一个结果。相反,pythonic方法是使用in运算符。IEelif -3 in grades:
5. roundGrade尝试对不可迭代对象进行两次迭代
第五,gradesFinal = roundGrade(finalgrade)
不起作用,因为finalgrade = np.mean(trimmed)
它是一个数字。但是,您会在此单个数字上调用roundGrade,然后for grade in grades
在函数内的此单个数字上进行迭代roundGrade
。当您尝试执行相同的错误min(grade_groups,key=lambda x:abs(grade-x))
。这是因为您要在单个值上调用min。如果要最小化此配对,则更好的方法是。gradesRounded = [(grade,lambda x:abs(mean_grade-x)) for grade in grade_groups]
因此,当您传递列表或变量时,您应该知道这一点。
我已经编辑roundGrade以获取单个值,然后遍历您的成绩组以创建一个值绝对差值的元组列表,然后是成绩组中的成绩。然后我按升序对其进行排序,并简单地在第一个元组中返回第二个值,这是您在成绩表中的成绩。请注意,尽管这样做的缺点是,如果mean_grade恰好位于grade_groups中的两个相邻值之间,则总是返回grade_groups中的较低成绩。
放在一起,做到这一点的一种方法是:
import numpy as np
def computeFinalGrades(grades):
if -3 in grades:
print grades
gradesFinal= -3
elif len(grades)>=2:
grades.remove(min(grades))
finalgrade = np.mean(grades)
gradesFinal = roundGrade(finalgrade)
elif len(grades)==1:
gradesFinal = grades
return gradesFinal
def roundGrade(mean_grade):
grade_groups = [-3,0,2,4,7,10,12]
gradesRounded = [(abs(grade-mean_grade),grade)for grade in grade_groups]
gradesRounded.sort()
return gradesRounded[0][1]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句