846.多关键字排序
题目
描述
给定n个同学的学号(从1到n编号)和他们的考试成绩,表示为(学号,考试成绩。
请将这些学生按考试成绩降序排序,若考试成绩相同,则按学号升序排序。
样例
example 1:
input: array = [[2,50],[1,50],[3,100]]
output: [[3,100],[1,50],[2,50]]
example 2:
input: array = [[2,50],[1,50],[3,50]]
ouutput: [[1,50],[2,50],[3,50]]
题解
思路
1. 先根据每名同学的成绩(忽略学号问题)进行降序排序;
2. 再根据学号对成绩重复的同学进行排序;
步骤
- 利用
list.sort()
对成绩进行降序排序; - 排序后的名单中,成绩重复者相连,遍历整个成绩单;
- 遇到成绩相同者,开始内层遍历,直至成绩不同;
- 对重复成绩段,利用
sorted()
进行排序;
注意:对部分列表排序利用sorted()
先排序再返回原列表
- 对重复成绩段,利用
- 成绩不重复,则更新前者成绩指针;
- 遇到成绩相同者,开始内层遍历,直至成绩不同;
- 返回排序后列表;
程序
def multiSort(array:list):
#现将学生按成绩降序排列
array.sort(key = lambda x:x[1],reverse = True)
#再遍历名单,将重复成绩按学号升序排列
i,lens = 1,len(array)
grade_before = array[0][1]
while i < lens:
if array[i][1] == grade_before:
#针对重复成绩,先找到重复次数
j = i #保护i,(i-1)为重复起点
while j < lens and array[j][1] == grade_before:
j = j + 1
#对重复部分,按学号升序排列
re_grade = sorted(array[i-1:j],reverse = False) # j指向重复成绩的下一个
array[i-1:j] = re_grade
i = j
else:
# 更新前者成绩
grade_before = array[i][1]
i = i + 1
return array