Python语言中,有很多种排序算法,可以通过自带的排序函数sort(),快速地对列表进行排序,但是如果对于特殊的需求,我们需要自定义排序函数。
一、自定义排序函数基础知识
排序函数主要是通过比较两个元素的大小来进行排序,因此我们需要对比较大小的方法进行定义,并将其作为参数传入自定义排序函数中。
def compare(x, y): if x > y: return 1 elif x < y: return -1 else: return 0 a = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] a.sort(compare) print(a)
以上代码中,compare()函数接收两个参数x和y,用来判断x和y之间的大小,如果x比y大,则返回1;如果x比y小,则返回-1;如果x和y相等,则返回0。sort()函数接收一个比较大小的方法作为参数,对列表进行排序。
在上述代码中,我们使用了一个列表a,来对比较大小的方法进行测试。如果想要将a从大到小进行排序,则需要修改compare()方法,即将返回值的三个分支中的1和-1进行调换。
二、按照特定条件排序
在实际开发中,有时需要根据自定义的条件对列表进行排序,如根据年龄、成绩等条件进行排序。此时,我们需要将比较大小的条件逐一考虑,进行比较。
def sort_by_age(person): return person["age"] people = [ {"name": "Alice", "age": 25}, {"name": "Bob", "age": 18}, {"name": "Charlie", "age": 25}, {"name": "David", "age": 32}, {"name": "Eva", "age": 21}, {"name": "Frank", "age": 25}, {"name": "Grace", "age": 32}, ] people.sort(key=sort_by_age) print(people)
以上代码中,我们将人员信息存储在一个列表中,每个人都包括姓名和年龄两个属性。如果想要按照年龄从小到大进行排序,则需要定义一个sort_by_age()函数,用来提取每个人的年龄。sort()函数的key参数接收一个函数作为参数,用来提取比较大小的条件。
三、按照多个条件进行排序
有时候,需要对多个条件进行排序,如先按照年龄升序排序,再按照姓名升序排序。此时,我们需要在比较大小的方法中,逐一判断多个条件,保证每个条件都得到正确的比较结果。
def compare(person1, person2): if person1["age"] < person2["age"]: return -1 elif person1["age"] > person2["age"]: return 1 else: if person1["name"] < person2["name"]: return -1 elif person1["name"] > person2["name"]: return 1 else: return 0 people = [ {"name": "Alice", "age": 25}, {"name": "Bob", "age": 18}, {"name": "Charlie", "age": 25}, {"name": "David", "age": 32}, {"name": "Eva", "age": 21}, {"name": "Frank", "age": 25}, {"name": "Grace", "age": 32}, ] people.sort(compare) print(people)
以上代码中,我们需要比较每个人的年龄和姓名两个条件。因此,在compare()方法中,先进行年龄的比较,如果年龄相同,则进行姓名的比较,如果姓名也相同,则认为两个人相等。
四、附加题:5到10数字比较大小
按照题目要求,对5到10这5个数字进行比较,并从小到大排序。
def compare(x, y): return x - y a = [10, 5, 8, 7, 6, 9, 4, 3, 2, 1] a.sort(compare, key=lambda x: abs(x - 7.5)) print(a)
以上代码中,我们定义了一个compare()函数,用来对5到10这5个数字进行比较。sort()方法的key参数中使用了lambda表达式,用来按照距离7.5的距离排序。因为5到10这5个数字的中位数为7.5,因此使用距离中位数的距离作为排序的参考值,可以保证排序的准确性。