首页 > 解决方案 > 如何按年级(升序)然后按姓名(降序)对学生数据进行排序?

问题描述

10
John Seen 3.7
Bill Stark 2.06
Jack Connor 3.47
Drake Mason 3.05
Bill Callum 2.83
Emma Jake 3.65
William Damian 3.33
James Charlie 3.56
Oscar Rhys 3.78
George Reece 2.52

因此,如果有相同的“GPA”数字(值),它应该按键排序(降序)。

以下代码按值排序,然后按键排序,但升序

n = int(input())
grades = {}
result = ''
for i in range(n):
    student = input().split()
    grades[student[0] + ' ' + student[1]] = eval(student[2])

sorted_d = sorted(grades.items(), key=lambda x: (-x[1], x[0]))
for i in sorted_d:
    print(str(i[0]) + " - " + str(i[1]))

标签: pythonsorting

解决方案


您的代码中有几个误解:

  • 您选择了一个grades带有键(学生姓名)和值(GPA/等级)的字典
  • 糟糕的选择。您不能直接“排序”字典的 (key, value) 的元组。dict错误的选择也是如此。
  • 相反,您希望数据是列表/元组的列表(student,grade)
  • 所以你不应该使用 dict grades,你应该使用列表。(然而,由于它现在是一个(student,grade)元组列表,所以称它为 eg sgor student_gradesor dator something)。
  • 那么您的排序功能将非常简单。如果您不需要 col 1 上的升序,而是 col 0 上的降序,您可以这样做 l.sort(key=operator.itemgetter(1,2))。但是您需要不同的订单,因此这会迫使您使用自定义sort(cmp=...)请参见例如

我把它留给你来重构你的代码。一旦你正确分解它,它看起来就像一个相当简单的练习。这个故事的寓意是仔细考虑你为你需要做的任务选择的数据结构:正确的选择会让事情变得简单;错误的选择会产生问题,那么您需要重新审视最初的假设并考虑替代方案。


推荐阅读