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