在Python开发中,列表是最常用的数据结构之一,对列表中的元素进行排序是很多场景下都需要实现的功能。Python提供了两种核心的列表排序方式,分别是列表对象自带的sort方法和内置的sorted函数,二者在使用场景和特性上存在明显区别,下面来逐一讲解。

sort方法:原地修改列表的排序方式
sort是列表对象自带的方法,调用后会直接修改原列表的顺序,不会返回新的列表对象,这种排序方式属于原地排序,适合不需要保留原列表顺序的场景。
基本使用
sort方法默认按照升序对列表元素进行排序,支持整数、浮点数、字符串等可比较类型的元素。
# 整数列表排序 num_list = [3, 1, 4, 2, 5] num_list.sort() print(num_list) # 输出 [1, 2, 3, 4, 5] # 字符串列表排序,按照字符ASCII码升序排列 str_list = ["banana", "apple", "cherry"] str_list.sort() print(str_list) # 输出 ['apple', 'banana', 'cherry']
常用参数
sort方法有两个常用参数,分别是reverse和key:
- reverse:布尔类型参数,默认值为False,表示升序排列;设置为True时,会按照降序排列。
- key:接收一个函数作为参数,这个函数会作用于列表的每个元素,排序时会按照函数返回的结果进行排序,不会改变原元素的值。
# 降序排序 num_list = [3, 1, 4, 2, 5] num_list.sort(reverse=True) print(num_list) # 输出 [5, 4, 3, 2, 1] # 按照字符串长度排序 str_list = ["banana", "apple", "cherry", "pear"] str_list.sort(key=len) print(str_list) # 输出 ['pear', 'apple', 'banana', 'cherry']
sorted函数:返回新排序列表的方式
sorted是Python的内置函数,调用后会返回一个新的排序后的列表,不会修改原列表的顺序,适合需要保留原列表的场景,并且sorted函数不仅可以处理列表,还可以处理元组、集合等其他可迭代对象。
基本使用
sorted函数默认同样按照升序返回新的排序结果,原可迭代对象保持不变。
# 对列表排序,原列表不变 num_list = [3, 1, 4, 2, 5] new_list = sorted(num_list) print(new_list) # 输出 [1, 2, 3, 4, 5] print(num_list) # 输出 [3, 1, 4, 2, 5] # 对元组排序,返回列表 tuple_data = (3, 1, 4, 2, 5) new_tuple_list = sorted(tuple_data) print(new_tuple_list) # 输出 [1, 2, 3, 4, 5]
常用参数
sorted函数的参数和sort方法基本一致,同样支持reverse和key参数,用法也完全相同。
# 降序排序 num_list = [3, 1, 4, 2, 5] new_list = sorted(num_list, reverse=True) print(new_list) # 输出 [5, 4, 3, 2, 1] # 按照自定义规则排序,比如按照元素的绝对值排序 num_list = [-3, 1, -4, 2, 5] new_list = sorted(num_list, key=abs) print(new_list) # 输出 [1, 2, -3, -4, 5]
两种排序方式的区别对比
为了更清晰地了解两种排序方式的差异,下面从多个维度进行对比:
| 对比维度 | sort方法 | sorted函数 |
|---|---|---|
| 是否修改原列表 | 是,原地排序 | 否,返回新列表 |
| 适用对象 | 仅列表对象 | 所有可迭代对象 |
| 返回值 | None | 新的排序后列表 |
| 内存占用 | 较低,无需额外创建列表 | 较高,需要创建新列表 |
自定义复杂排序规则
当排序需求比较复杂时,可以通过key参数传入自定义的函数来实现,比如需要对列表中的字典元素按照某个键的值排序,或者需要多条件排序。
对字典列表排序
# 按照字典的age键升序排序
student_list = [
{"name": "张三", "age": 20},
{"name": "李四", "age": 18},
{"name": "王五", "age": 22}
]
# 使用lambda函数指定排序键
student_list.sort(key=lambda x: x["age"])
print(student_list)
# 输出 [{'name': '李四', 'age': 18}, {'name': '张三', 'age': 20}, {'name': '王五', 'age': 22}]
多条件排序
如果需要先按照一个条件排序,条件相同再按照另一个条件排序,可以在key函数里返回一个元组,元组里的元素会依次作为排序的优先级。
# 先按照分数降序,分数相同再按照年龄升序
student_list = [
{"name": "张三", "score": 90, "age": 20},
{"name": "李四", "score": 85, "age": 18},
{"name": "王五", "score": 90, "age": 19}
]
# 注意reverse=True是整体降序,这里分数要降序,年龄要升序,所以分数取负,年龄取原值
student_list.sort(key=lambda x: (-x["score"], x["age"]))
print(student_list)
# 输出 [{'name': '王五', 'score': 90, 'age': 19}, {'name': '张三', 'score': 90, 'age': 20}, {'name': '李四', 'score': 85, 'age': 18}]
注意事项
- 列表中的元素必须是可比较的类型,否则会抛出TypeError异常,比如列表中同时包含整数和字符串,调用排序方法就会报错。
- 如果不需要保留原列表,优先使用sort方法,内存效率更高;如果需要保留原列表或者处理非列表的可迭代对象,使用sorted函数更合适。
- 自定义key函数时,要保证函数对所有元素都能返回有效的可比较结果,避免出现异常。