我有一个字典,其中键是名称,值是最多3个整数的列表(这些是指定人员的分数):
classScores={
'Bob':[1, 6, 3],
'Jim':[6, 10, 3],
'Fred':[0, 2]
}
我需要按照分数的平均值(最高的第一个)进行打印。我创建了一个工作代码来执行此操作:
classAverages={}
for student in classScores:
classAverages[student]=sum(classScores[student])/len(classScores[student])
for student in sorted(classAverages, key=classAverages.get, reverse=True):
print(student, "Average:", sum(classScores[student])/len(classScores[student]))
然而,我认为这是低效的,因为它使用2个for
循环,所以必须经过两次每个学生。因此,我正在寻找将排序纳入第二个循环的建议(可能是它的排序函数)。
更新:我已经使用lambda,但我已经在for
循环之前定义了它,这样我也可以用它来打印平均值:
classAverages=lambda student: sum(classScores[student]) / len(classScores[student])
for student in sorted(classScores, key=classAverages, reverse=True):
print(student, "Average:", classAverages(student))
答案 0 :(得分:4)
您可以在key
函数中计算每位学生的平均值:
for student in sorted(classScores, key=lambda k: sum(classScores[k]) / len(classScores[k]), reverse=True):
然而,使用两个循环效率稍差;你只增加了每个学生的固定成本来确定订单。当显示平均值时,您错过了在第二个循环中重复使用该平均值的机会:
classAverages={}
for student in classScores:
classAverages[student] = sum(classScores[student]) / len(classScores[student])
for student in sorted(classAverages, key=classAverages.get, reverse=True):
print(student, "Average:", classAverages[student])
您可以循环生成器表达式中的字典项以计算平均值,对这些平均值进行排序,然后在一次操作中显示计算的平均值:
student_averages = ((sum(scores) / len(scores), s) for s, scores in classScores.items())
for average, student in sorted(student_averages, reverse=True):
print(student, "Average:", average)
生成器以(average, student)
对生成数据以便于排序(我们现在不需要key
来挑选第二个值。)