如何按年级(升序)然后按名称(降序)对学生数据进行排序?

时间:2018-11-17 02:54:47

标签: python sorting

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]))

1 个答案:

答案 0 :(得分:0)

您的代码中存在一些误解:

  • 您选择了带有键(学生姓名)和值(GPA /年级)的字典grades
  • 错误的选择。您不能直接“排序”字典(键,值)的元组。所以dict是错误的选择。
  • 相反,您希望数据是(student,grade)的列表/元组的列表
  • 因此,您不应该对grades使用字典,应该使用列表。 (但是,由于它现在是(student,grade)元组的列表,因此可以将其命名为sgstudent_gradesdat等)。
  • 然后,您的排序功能将非常简单。如果仅不需要在第1列上的升序,而是在第0列上的降序,则可以执行l.sort(key=operator.itemgetter(1,2))。但是您需要不同的顺序,因此迫使您使用自定义sort(cmp=...),例如参见this

我留给您重构代码。正确分解后,看起来就像是一个非常简单的练习。 故事的寓意是仔细考虑您为需要执行的任务选择的数据结构:正确的选择将使事情变得简单;错误的选择会造成问题,然后您需要重新考虑最初的假设并考虑其他选择。