我有一本字典,其中的键是名称,值是最多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))
您可以在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)
成对产生数据以简化排序(我们现在不需要akey
来挑选第二个值)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句