python - 如何按年级(升序)然后按姓名(降序)对学生数据进行排序?
问题描述
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]))
解决方案
您的代码中有几个误解:
- 您选择了一个
grades
带有键(学生姓名)和值(GPA/等级)的字典 - 糟糕的选择。您不能直接“排序”字典的 (key, value) 的元组。
dict
错误的选择也是如此。 - 相反,您希望数据是列表/元组的列表
(student,grade)
- 所以你不应该使用 dict
grades
,你应该使用列表。(然而,由于它现在是一个(student,grade)
元组列表,所以称它为 egsg
orstudent_grades
ordat
or something)。 - 那么您的排序功能将非常简单。如果您不需要 col 1 上的升序,而是 col 0 上的降序,您可以这样做
l.sort(key=operator.itemgetter(1,2))
。但是您需要不同的订单,因此这会迫使您使用自定义sort(cmp=...)
请参见例如此
我把它留给你来重构你的代码。一旦你正确分解它,它看起来就像一个相当简单的练习。这个故事的寓意是仔细考虑你为你需要做的任务选择的数据结构:正确的选择会让事情变得简单;错误的选择会产生问题,那么您需要重新审视最初的假设并考虑替代方案。
推荐阅读
- java - 我在解决 MYSQL 连接的 ClassNotFoundExcepton 时遇到问题,找不到库文件夹 Netbeans?
- azure - 无服务器 SignalR 服务 - Azure Functions 提供什么?
- coq - IndProp:证明 Prop 不可证明
- php - Laravel:如何在 maatwebsite DOMPDF 导出中更改 PDF 样式?
- c++ - 我在 Windows 上构建了一个 C++ 程序,如何为 MacOS 编译一个可执行文件?
- flask - 为具有 pytest 和覆盖率的 Flask 应用程序编写 test_login
- haskell - 数据构造函数不在范围内 - Haskell
- javascript - 使用构造函数移动心脏
- javascript - React Native 上的 Like 按钮?我不能让它动态更新
- php - WooCommerce:获取选择的包裹运输方式并将其存储为订单项目元数据