Python sort如何保持原顺序
在编程中,排序是一项常见的操作。然而,有时我们希望保持原始顺序,而不是简单地按照某种规则对数据进行排序。本文将探讨如何使用Python的sort方法来保持原始顺序,并解决一个实际问题。
问题描述
假设我们有一个包含学生信息的列表,每个学生都有一个唯一的ID和一个分数。现在我们希望按照学生的分数对列表进行排序,但是保持具有相同分数的学生在结果中的相对顺序不变。
例如,我们有以下学生列表:
students = [
{"id": 1, "name": "Alice", "score": 90},
{"id": 2, "name": "Bob", "score": 80},
{"id": 3, "name": "Charlie", "score": 70},
{"id": 4, "name": "David", "score": 80},
]
我们希望按照学生的分数从高到低对列表进行排序,得到以下结果:
sorted_students = [
{"id": 1, "name": "Alice", "score": 90},
{"id": 4, "name": "David", "score": 80},
{"id": 2, "name": "Bob", "score": 80},
{"id": 3, "name": "Charlie", "score": 70},
]
可以看到,即使Bob和David的分数相同,他们在结果中的相对顺序保持不变。
解决方案
为了解决这个问题,我们可以使用Python的sort方法,并结合自定义的排序规则。我们可以定义一个函数,该函数接受一个学生对象作为参数,并返回一个用于排序的关键字。
def sort_key(student):
return (-student["score"], student["id"])
在这个函数中,我们首先按照分数降序排序,然后按照ID升序排序。这样做的目的是保证具有相同分数的学生在结果中的相对顺序不变。
接下来,我们可以使用sort方法,并使用我们定义的sort_key函数作为key参数,来对学生列表进行排序。
students.sort(key=sort_key)
完成排序后,students列表将按照我们的要求进行排序,并且保持具有相同分数的学生的相对顺序不变。
示例
下面是一个完整的示例代码:
def sort_key(student):
return (-student["score"], student["id"])
students = [
{"id": 1, "name": "Alice", "score": 90},
{"id": 2, "name": "Bob", "score": 80},
{"id": 3, "name": "Charlie", "score": 70},
{"id": 4, "name": "David", "score": 80},
]
students.sort(key=sort_key)
for student in students:
print(student)
运行上述代码,你将得到以下输出:
{'id': 1, 'name': 'Alice', 'score': 90}
{'id': 4, 'name': 'David', 'score': 80}
{'id': 2, 'name': 'Bob', 'score': 80}
{'id': 3, 'name': 'Charlie', 'score': 70}
可以看到,学生列表已按照分数从高到低排序,且保持具有相同分数的学生的相对顺序不变。
甘特图
下面是一个使用甘特图展示整个过程的示例:
gantt
dateFormat YYYY-MM-DD
title Python sort如何保持原顺序
section 定义排序规则
定义排序规则 : 2023-01-01, 1d
section 对学生列表排序
对学生列表排序 : 2023-01-02, 2d
section 输出结果
输出结果 : 2023-01-04, 1d
饼状图
下面是一个使用饼状图展示学生分数分布的示例:
pie
title 学生分数分布
"90分" : 30
"80分" : 40