在Python开发中,列表是最常用的数据结构之一,对列表元素进行排序是日常编码中非常常见的需求。根据是否修改原列表,排序操作可以分为永久性排序和临时排序两类,对应的实现方法各有特点,适用场景也不同。

永久性排序:sort方法
列表的sort方法是Python内置的永久性排序方法,调用后会直接修改原列表的元素顺序,原列表的内容会发生改变,不会返回新的列表对象。
基本语法
sort方法的基本语法如下:
# 列表.sort(key=None, reverse=False) # key:可选参数,用于指定排序的比较规则,接收函数作为参数 # reverse:可选参数,布尔类型,默认False表示升序排序,True表示降序排序
使用示例
对纯数字列表进行升序排序:
num_list = [3, 1, 4, 2, 5] num_list.sort() print(num_list) # 输出:[1, 2, 3, 4, 5]
对字符串列表进行降序排序:
str_list = ["apple", "banana", "cherry", "date"] str_list.sort(reverse=True) print(str_list) # 输出:['date', 'cherry', 'banana', 'apple']
使用key参数自定义排序规则,比如按照字符串长度排序:
str_list = ["apple", "banana", "cherry", "date"] # 指定key为len函数,按照字符串长度排序 str_list.sort(key=len) print(str_list) # 输出:['date', 'apple', 'banana', 'cherry']
临时排序:sorted函数
sorted是Python内置的全局函数,它可以对任意可迭代对象进行排序,排序后会返回一个新的排序后的列表,不会修改原列表的内容,属于临时排序操作。
基本语法
sorted函数的基本语法如下:
# sorted(可迭代对象, key=None, reverse=False) # 第一个参数是需要排序的可迭代对象,比如列表、元组等 # key和reverse参数与sort方法的对应参数作用一致
使用示例
对列表进行临时升序排序,原列表不变:
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],原列表未修改
对复杂结构的可迭代对象排序,比如对包含字典的列表按照字典的某个键排序:
student_list = [
{"name": "张三", "score": 85},
{"name": "李四", "score": 92},
{"name": "王五", "score": 78}
]
# 按照score键的值升序排序
sorted_student = sorted(student_list, key=lambda x: x["score"])
print(sorted_student)
# 输出:[{'name': '王五', 'score': 78}, {'name': '张三', 'score': 85}, {'name': '李四', 'score': 92}]
print(student_list) # 原列表未修改
两种方法的区别对比
为了更清晰地区分两种排序方法,我们可以通过下表对比它们的核心差异:
| 对比维度 | sort方法 | sorted函数 |
|---|---|---|
| 是否修改原列表 | 是,永久性修改 | 否,返回新列表 |
| 返回值 | None | 排序后的新列表 |
| 适用对象 | 仅列表对象 | 所有可迭代对象 |
| 内存占用 | 较低,原地修改 | 较高,需要创建新列表 |
使用注意事项
- 如果不需要保留原列表的顺序,优先使用sort方法,内存效率更高;如果需要保留原列表,必须使用sorted函数。
- key参数接收的函数需要是单参数函数,且返回值是可比较的类型,否则会抛出类型错误。
- 当列表中的元素类型不一致时,比如同时包含数字和字符串,直接排序会抛出类型错误,需要提前处理元素类型或者自定义key规则。
注意:sort方法没有返回值,如果将其返回值赋值给变量,得到的会是None,这是新手常犯的错误,使用时需要特别注意。