Python 中的排序排序函数及区别
在 Python 中,常用的排序功能主要通过两种方式实现:sorted()
内置函数和列表的 sort()
方法。它们都能完成排序任务,但在使用场景和特性上有显著区别。
一、两种核心排序工具
1. sorted()
内置函数
功能:对可迭代对象进行排序,返回一个新的排序后的列表。
基本语法:
sorted(iterable, key=None, reverse=False)
参数说明:
iterable
:需要排序的可迭代对象(列表、元组、字符串、字典等)key
:排序依据的函数(可选)reverse
:排序方向,False
为升序(默认),True
为降序
示例:
# 对列表排序
nums = [3, 1, 4, 1, 5]
sorted_nums = sorted(nums) # [1, 1, 3, 4, 5]# 对元组排序(返回列表)
tup = (5, 2, 7)
sorted_tup = sorted(tup) # [2, 5, 7]# 对字符串排序(按字符编码)
s = "cab"
sorted_s = sorted(s) # ['a', 'b', 'c']
2. list.sort()
方法
功能:对列表本身进行排序,修改原列表,无返回值(返回 None
)。
基本语法:
list.sort(key=None, reverse=False)
参数说明:与 sorted()
相同,但只能用于列表对象。
示例:
nums = [3, 1, 4, 1, 5]
nums.sort() # 原列表被修改
print(nums) # [1, 1, 3, 4, 5]
二、核心区别对比
特性 | sorted() 函数 |
list.sort() 方法 |
---|---|---|
适用对象 | 所有可迭代对象(列表、元组、字符串等) | 仅适用于列表(list 类型) |
是否修改原对象 | 不修改,返回新的排序列表 | 修改原列表,无返回值(返回 None ) |
返回值 | 排序后的新列表 | None |
内存占用 | 会创建新列表,占用额外内存 | 原地排序,内存效率更高 |
使用场景 | 需要保留原数据或对非列表排序 | 仅对列表排序且可修改原列表 |
三、相同点:排序规则与参数
两种排序方式都支持相同的排序规则和参数:
1. key
参数:自定义排序依据
通过指定函数作为 key
,可以按自定义规则排序:
# 按字符串长度排序(sorted示例)
words = ['apple', 'banana', 'cherry']
sorted_words = sorted(words, key=len) # ['apple', 'banana', 'cherry']# 按绝对值排序(sort示例)
nums = [-3, 1, -5, 2]
nums.sort(key=abs) # [1, 2, -3, -5]
2. reverse
参数:控制排序方向
# 降序排序
nums = [3, 1, 4]
print(sorted(nums, reverse=True)) # [4, 3, 1]nums.sort(reverse=True)
print(nums) # [4, 3, 1]
3. 稳定性
两者都是稳定排序:当元素的值相等时,会保留它们在原序列中的相对顺序。
people = [('Alice', 25), ('Bob', 20), ('Charlie', 25)]# 按年龄排序,年龄相同则保持原顺序
sorted_people = sorted(people, key=lambda x: x[1])
# [('Bob', 20), ('Alice', 25), ('Charlie', 25)] (Alice在Charlie前,与原顺序一致)
四、其他排序相关工具
1. reversed()
函数
不是排序函数,但可用于反转序列(返回迭代器):
nums = [1, 2, 3]
reversed_nums = list(reversed(nums)) # [3, 2, 1](不排序,仅反转)
2. 字典的排序
对字典排序时,sorted()
会按键排序,或通过 key
参数指定按值排序:
d = {'b': 2, 'a': 1, 'c': 3}# 按键排序(返回键的列表)
sorted_keys = sorted(d) # ['a', 'b', 'c']# 按值排序(返回键值对元组的列表)
sorted_items = sorted(d.items(), key=lambda x: x[1]) # [('a', 1), ('b', 2), ('c', 3)]
五、如何选择?
- 当需要保留原数据时,用
sorted()
- 当处理列表且允许修改原数据时,用
list.sort()
(内存效率更高) - 当需要对非列表对象(如元组、字符串)排序时,必须用
sorted()
- 当需要链式操作时,用
sorted()
(因为它有返回值):# 链式操作示例 result = sorted(nums, key=abs)[:3] # 排序后取前3个元素
总结
sorted(iterable)
:通用排序工具,返回新列表,不修改原数据,适用于所有可迭代对象。list.sort()
:列表专属方法,原地排序,无返回值,内存效率高。
两者核心排序逻辑一致,都支持 key
和 reverse
参数,选择时主要根据是否需要保留原数据和操作对象类型来决定。