按值列表的平均值对字典进行排序

时间:2015-05-31 14:16:45

标签: python sorting python-3.x dictionary

我有一个字典,其中键是名称,值是最多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))

1 个答案:

答案 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来挑选第二个值。)