📜  python 排序数组自定义比较器 - Python (1)

📅  最后修改于: 2023-12-03 15:34:11.779000             🧑  作者: Mango

Python 排序数组自定义比较器

在 Python 中,我们可以使用内置的排序函数 sorted() 来对数组进行排序。然而,有时候我们需要使用自定义的比较器来实现特定的排序逻辑。本文将介绍如何在 Python 中使用自定义比较器来排序数组。

排序函数语法

Python 中内置的排序函数 sorted() 的语法如下:

sorted(iterable, key=None, reverse=False)

其中:

  • iterable:要排序的可迭代对象,如列表、元组等。
  • key:用于指定排序的比较器,可以是一个函数或 lambda 表达式。如果不指定,则按元素直接比较。
  • reverse:是否倒序排序,默认为 False,表示升序排序。
自定义比较器

自定义比较器是一个函数,它接受一个元素作为参数并返回一个可排序的值,用于对元素进行比较。比如我们可以自定义一个按元素长度从小到大排序的比较器:

def cmp_len(s):
    return len(s)

然后,我们可以将其作为 key 参数传入 sorted() 函数,对数组进行排序:

arr = ['a', 'ccc', 'bb']
sorted_arr = sorted(arr, key=cmp_len)  # ['a', 'bb', 'ccc']

注意,自定义比较器函数应该只接受一个参数,并返回一个能够比较的值,比如数字或字符串。如果要进行复合排序,可以使用元组来表示多个排序因素。

示例

下面是一个完整的示例程序,它使用自定义比较器来对学生列表按成绩从高到低排序(如果成绩相同,则按名字字典序排序):

from typing import List

class Student:
    def __init__(self, name: str, score: int):
        self.name = name
        self.score = score

def cmp_student(s: Student):
    return (-s.score, s.name)

def sort_students(students: List[Student]) -> List[Student]:
    return sorted(students, key=cmp_student)

students = [
    Student('Alice', 80),
    Student('Bob', 90),
    Student('Charlie', 70),
    Student('David', 90),
]

sorted_students = sort_students(students)
for s in sorted_students:
    print(s.name, s.score)

输出如下:

Bob 90
David 90
Alice 80
Charlie 70

在上面的示例中,我们定义了一个 Student 类,它包含了学生的名字和成绩。然后我们定义了一个按成绩从高到低、名字从小到大排序的比较器 cmp_student,并将其作为 key 参数传入 sorted() 函数,对学生列表进行排序。

总结

本文介绍了如何在 Python 中使用自定义比较器来对数组进行排序,以及如何使用元组进行复合排序。自定义比较器是实现特定排序逻辑的重要工具,可以大大提高程序的灵活性和可读性。