Python sorted() 语法
sorted() 是 Python 的一个内置函数,它用于对一个可迭代对象中的所有元素排序,并且返回一个列表作为结果(不会修改原对象)。
语法:
sorted(iterable, key=None, reverse=False)说明:
sorted() 函数接收以下 3 个参数。
iterable(必选):是一个可迭代对象,比如元组、列表、字典等。key(可选,默认值:None):用于排序比较的函数。reverse(可选,默认值:False):用于排序的规则。如果为 True,则表示降序排列;如果为 False,则表示升序排列。
对于 sorted() 函数来说,所有待排序的元素必须是可比较的。这意味着它们要么是相同类型(且该类型支持比较操作),要么是不同类型但可以相互比较(例如,整数和浮点数)。如果类型之间无法比较(例如,数字和字符串),会引发 TypeError 异常。
提示: sorted() 不会修改原始的可迭代对象。
Python sorted() 摘要
| 使用频率 | 高 |
|---|---|
| 时间复杂度 | O(n log n) |
| 官方文档 | 查看 |
| 相关函数 | reversed() |
Python sorted() 示例
接下来,我们通过几个简单的例子来讲解一下 Python sorted() 函数是如何使用的。
示例 1:sorted() 对序列排序
# 列表
a = [3, 9, 1, 12, 50, 21]
print(sorted(a))
# 元组
b = (3, 9, 1, 12, 50, 21)
print(sorted(b))
# 字符串
c = 'Python'
print(sorted(c))运行结果如下。
[1, 3, 9, 12, 21, 50]
[1, 3, 9, 12, 21, 50]
['P', 'h', 'n', 'o', 't', 'y']分析:
sorted() 函数默认使用的是升序排列,如果希望降序排列,可以使用 reverse = True 来实现。
示例 2:sorted() 降序排列
# 列表
a = [3, 9, 1, 12, 50, 21]
print(sorted(a, reverse=True))
# 元组
b = (3, 9, 1, 12, 50, 21)
print(sorted(b, reverse=True))
# 字符串
c = 'Python'
print(sorted(c, reverse=True))运行结果如下。
[50, 21, 12, 9, 3, 1]
[50, 21, 12, 9, 3, 1]
['y', 't', 'o', 'n', 'h', 'P']示例 3:sorted() 对复杂列表排序
users = [('Tony', 20), ('Jack', 21), ('Lucy', 19)]
result = sorted(users, key=lambda user: user[0])
print(result)运行结果如下。
[('Jack', 21), ('Lucy', 19), ('Tony', 20)]分析:
key 的值是一个函数,这个函数应该接收一个参数,然后返回一个用于排序的 key 值。该函数只需要调用一次,所以排序速度很快。
users 是一个列表,这个列表的每一个元素是一个元组。lambda 表达式本质上就是一个函数,lambda user: user[0] 表示函数的参数是 user,也就是 user 这个列表的每一个元素。user[0] 表示这个 lambda 表达式最终返回的是元组的第 1 个元素。也就是说,此时用于排序的是每一个用户的姓名。
如果想要对每一个用户的年龄进行排序,此时也十分简单。只需要修改一下 lambda 表达式的返回值就可以了,代码如下。
result = sorted(users, key=lambda user: user[1])示例 4:sorted() 按绝对值排序
nums = [3, -9, 1, -14, 50, -21]
result = sorted(nums, key=abs)
print(result)运行结果如下。
[1, 3, -9, -14, -21, 50]分析:
key=abs 表示按绝对值排序。对于上面示例来说,如果把 sorted(nums, key=abs) 中的 “key=abs” 删除,此时运行结果如下。
[-21, -14, -9, 1, 3, 50]示例 5:sorted() 对字典排序
d = {'b': 2, 'c': 3, 'a': 1}
result = sorted(d)
print(result)运行结果如下。
['a', 'b', 'c']分析:
sorted() 函数对字典排序,其实是对键(key)进行排序。此时 sorted() 会返回一个列表,该列表包含排序后的键。
示例 6:sorted() 对集合排序
s = {3, 9, 1, 12, 50, 21}
result = sorted(s)
print(result)运行结果如下。
[1, 3, 9, 12, 21, 50]分析:
sorted() 函数对集合排序,会以列表的方式返回排序后的元素。
sorted() 函数与 sort() 方法
我们都知道,列表本身就自带了一个用于排序的 sort() 方法。sorted() 函数和 sort() 方法虽然看起来很像,但它们是完全不同的两个东西。
sorted():是一个内置函数,它不仅可以用于列表,还可以用于其他可迭代对象。此外,sorted() 不会修改原对象。sort():是列表的一个方法,它只能用于列表。此外,sort() 方法会修改原列表。
| sorted() 函数 | sort() 方法 | |
|---|---|---|
| 适用对象 | 任意可迭代对象 | 仅列表 |
| 返回值 | 新列表 | None(直接修改原列表) |
| 是否修改原对象 | 否 | 是 |
示例 7:sorted() 函数
nums = [3, 9, 1, 12, 50, 21]
result = sorted(nums)
print(nums)
print(result)运行结果如下。
[3, 9, 1, 12, 50, 21]
[1, 3, 9, 12, 21, 50]分析:
sorted() 函数并不会影响原列表,而是会返回一个新列表。
示例 8:sort() 方法
nums = [3, 9, 1, 12, 50, 21]
nums.sort()
print(nums)运行结果如下。
[1, 3, 9, 12, 21, 50]分析:
sort() 方法会直接对原列表进行修改,但很多时候并不希望原列表被修改,此时就可以使用 sorted() 函数来实现。
常见问题
1. 如何实现大小写不敏感的字符串排序?
比如在下面代码中,我们可以通过 key = lambda x: x.lower() 对列表 words 进行不区分大小写的排序。
words = ['Apple', 'banana', 'Cherry', 'apricot']
print(sorted(words, key=lambda x: x.lower())) # 输出 : ['Apple', 'apricot', 'banana', 'Cherry']2. 如何对字典按值排序后获取键列表?
比如在下面代码中,我们可以通过 sorted() 和 key = lambda x: x[1] 对字典 d 按值排序,并提取排序后的键。
d = {'b': 2, 'c': 3, 'a': 1}
sorted_keys = [k for k, v in sorted(d.items(), key=lambda x: x[1])]
print(sorted_keys) # 输出 : ['a', 'b', 'c']