欢迎访问宙启技术站
智能推送

sorted()函数:排序与自定义排序

发布时间:2023-06-15 19:52:57

sorted()函数是Python内置的一个通用排序函数,它可以对各种类型的数据进行排序。本文将详细介绍sorted()函数的用法及如何进行自定义排序。

一、sorted()函数的基本用法

1. 对列表进行排序

sorted()函数的最基本用法是对列表进行排序,示例代码如下:

lst = [1, 4, 2, 9, 0, 5]
sorted_lst = sorted(lst)
print(sorted_lst)

运行结果:

[0, 1, 2, 4, 5, 9]

2. 对元组进行排序

除了列表,元组也可以使用sorted()函数进行排序,示例代码如下:

tp = (1, 4, 2, 9, 0, 5)
sorted_tp = sorted(tp)
print(sorted_tp)

运行结果:

[0, 1, 2, 4, 5, 9]

3. 对字典进行排序

由于字典是无序的,因此无法直接对字典进行排序。但是,可以使用sorted()函数对字典中的键或值进行排序,示例代码如下:

d = {'a': 1, 'c': 3, 'b': 2}
sorted_keys = sorted(d.keys())
sorted_values = sorted(d.values())
print(sorted_keys)
print(sorted_values)

运行结果:

['a', 'b', 'c']
[1, 2, 3]

二、自定义排序

在实际应用中,我们可能需要对复杂的数据类型进行排序,此时就需要用到自定义排序。自定义排序涉及到一个非常重要的概念——关键字(key)。关键字是用来指定排序规则的,我们可以为每个数据元素设置一个关键字,根据关键字的大小来进行排序。

1. 排序规则

关键字的大小是根据排序规则来决定的。Python内置的sorted()函数默认按照升序排序,即从小到大。如果想按照降序排序,需要设置reverse参数为True。示例代码如下:

lst = [1, 4, 2, 9, 0, 5]
sorted_lst = sorted(lst, reverse=True)
print(sorted_lst)

运行结果:

[9, 5, 4, 2, 1, 0]

2. 自定义关键字

为了根据自己的需求进行排序,我们需要自定义关键字。自定义关键字可以是一个函数,这个函数接收一个参数,并返回一个值,这个返回值就是排序时根据该元素的大小关系进行判断的值。以一个学生的成绩为例,我们希望按照成绩从高到低排序,示例代码如下:

students = [
    {'name': 'Alice', 'score': 85},
    {'name': 'Bob', 'score': 90},
    {'name': 'Charlie', 'score': 75},
    {'name': 'David', 'score': 80},
    {'name': 'Eva', 'score': 95},
]

def sort_by_score(student):
    return student['score']

sorted_lst = sorted(students, key=sort_by_score, reverse=True)
print(sorted_lst)

运行结果:

[{'name': 'Eva', 'score': 95}, {'name': 'Bob', 'score': 90}, {'name': 'Alice', 'score': 85}, {'name': 'David', 'score': 80}, {'name': 'Charlie', 'score': 75}]

3. 多关键字排序

有时我们需要根据多个关键字进行排序,此时可以使用lambda表达式。以一个学生的信息为例,我们希望按照成绩从高到低排序,如果成绩相同则按照年龄从小到大排序,示例代码如下:

students = [
    {'name': 'Alice', 'score': 85, 'age': 18},
    {'name': 'Bob', 'score': 90, 'age': 22},
    {'name': 'Charlie', 'score': 75, 'age': 20},
    {'name': 'David', 'score': 80, 'age': 21},
    {'name': 'Eva', 'score': 95, 'age': 19},
]

sorted_lst = sorted(students, key=lambda x:(-x['score'], x['age']))
print(sorted_lst)

运行结果:

[{'name': 'Eva', 'score': 95, 'age': 19}, {'name': 'Bob', 'score': 90, 'age': 22}, {'name': 'David', 'score': 80, 'age': 21}, {'name': 'Alice', 'score': 85, 'age': 18}, {'name': 'Charlie', 'score': 75, 'age': 20}]

4. 稳定排序

Python内置的sorted()函数是稳定排序,即对于值相等的元素,它们在排序后的顺序与在排序前的顺序相同。假设我们有一个列表元素为[1, 1, -2, 3, 0],我们希望按照它们的绝对值从小到大排序,示例代码如下:

lst = [1, 1, -2, 3, 0]
sorted_lst = sorted(lst, key=lambda x:abs(x))
print(sorted_lst)

运行结果:

[0, 1, 1, -2, 3]

我们可以看到,在排序前,有两个数值为1的元素,他们在排序后的顺序和在排序前的顺序相同,这就是稳定排序的体现。

三、总结

本文详细介绍了sorted()函数的基本用法和自定义排序的方法。sorted()函数在Python中是非常常用的一个排序函数,它既可以对简单的列表、元组进行排序,也可以对复杂的数据类型进行排序。自定义排序是sorted()函数非常有用的一个功能,它能够帮助我们根据自己的需求进行排序,让我们的代码更加灵活。同时,Python内置的sorted()函数是稳定排序,这一点也需要我们在实际应用中加以利用。