Python sorted() 函数

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() 函数 vs 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']

上一篇: reversed()

下一篇: zip()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号