📅  最后修改于: 2023-12-03 15:37:38.187000             🧑  作者: Mango
在Python中,我们可以使用内置函数 sorted()
或 sort()
对可迭代对象进行排序。但是,如果我们要对自己定义的类的对象进行排序时,就需要重载一些内置的运算符和方法。
在 Python 中,我们可以通过重载以下一些内置的运算符和方法,让我们的类对象支持排序:
__lt__()
:小于运算符 <
,用于定义对象的小于关系。__le__()
:小于等于运算符 <=
,用于定义对象的小于等于关系。__eq__()
:等于运算符 ==
,用于定义对象的相等关系。__ne__()
:不等于运算符 !=
,用于定义对象的不等关系。__gt__()
:大于运算符 >
,用于定义对象的大于关系。__ge__()
:大于等于运算符 >=
,用于定义对象的大于等于关系。__cmp__()
:用于比较两个对象的相对大小,返回值为负数、0、正数分别表示小于、等于、大于。重载上述内置运算符和方法后,我们就可以在排序时使用这些运算符和方法了。
为了演示如何对用户定义的类的对象进行排序,我们定义一个学生类,其中包含学号、姓名和年龄等属性。为了方便,我们默认按照学号进行排序。
class Student:
def __init__(self, id_, name, age):
self.id = id_
self.name = name
self.age = age
def __str__(self):
return f'Student(id={self.id}, name={self.name}, age={self.age})'
def __lt__(self, other):
return self.id < other.id
def __eq__(self, other):
return self.id == other.id
上述代码中,__lt__()
方法中的比较运算符 <
定义了对象之间的小于关系,__eq__()
方法中的比较运算符 ==
定义了对象之间的相等关系。
接下来,我们可以创建一些学生对象,并将它们按照学号进行排序:
students = [Student(3, '张三', 19), Student(2, '李四', 20), Student(1, '王五', 18)]
# 使用 sorted() 函数排序
sorted_students = sorted(students)
print(sorted_students)
# 使用 sort() 方法排序
students.sort()
print(students)
输出结果如下:
[Student(id=1, name=王五, age=18), Student(id=2, name=李四, age=20), Student(id=3, name=张三, age=19)]
[Student(id=1, name=王五, age=18), Student(id=2, name=李四, age=20), Student(id=3, name=张三, age=19)]
通过上述示例代码,我们可以看到如何为自定义类的对象实现排序。实际上,在 Python 中,我们还可以通过 functools.cmp_to_key()
函数将对象的方法转换为比较函数,从而实现更加灵活的用户排序。