Python 中的排序函数及区别

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)]

五、如何选择?

  1. 当需要保留原数据时,用 sorted()
  2. 当处理列表且允许修改原数据时,用 list.sort()(内存效率更高)
  3. 当需要对非列表对象(如元组、字符串)排序时,必须用 sorted()
  4. 当需要链式操作时,用 sorted()(因为它有返回值):
    # 链式操作示例
    result = sorted(nums, key=abs)[:3]  # 排序后取前3个元素
    

总结

  • sorted(iterable):通用排序工具,返回新列表,不修改原数据,适用于所有可迭代对象。
  • list.sort():列表专属方法,原地排序,无返回值,内存效率高。

两者核心排序逻辑一致,都支持 keyreverse 参数,选择时主要根据是否需要保留原数据和操作对象类型来决定。

posted @ 2025-10-08 21:12  wangya216  阅读(107)  评论(0)    收藏  举报