跳到主要内容

Python sorted() 函数

sorted() 函数对给定可迭代对象中的元素进行排序(升序或降序)并将其作为列表返回。

示例

numbers = [4, 2, 12, 8]

sorted_numbers = sorted(numbers)
print(sorted_numbers)

# 输出: [2, 4, 8, 12]

sorted() 的语法

sorted() 函数的语法是:

sorted(iterable, key=None, reverse=False)

sorted() 参数

sorted() 最多可以接受三个参数:

  • iterable - 序列(字符串元组列表)或集合(集合字典冻结集合)或任何其他迭代器。
  • reverse(可选) - 如果为 True,则返回的列表为降序排序。如果未提供,默认为 False
  • key(可选) - 用作排序比较的关键字函数。默认为 None

sorted() 返回值

sorted() 函数返回排序后的列表。

示例 1:对字符串、列表和元组排序

# 元音列表
py_list = ['e', 'a', 'u', 'o', 'i']
print(sorted(py_list))

# 字符串
py_string = 'Python'
print(sorted(py_string))

# 元音元组
py_tuple = ('e', 'a', 'u', 'o', 'i')
print(sorted(py_tuple))

输出

['a', 'e', 'i', 'o', 'u']
['P', 'h', 'n', 'o', 't', 'y']
['a', 'e', 'i', 'o', 'u']

注意,在所有情况下都返回了排序后的列表。

注意:列表还有一个 sort() 方法,其功能与 sorted() 相同。唯一的区别是 sort() 方法不返回任何值并更改原始列表。

示例 2:降序排序

sorted() 函数接受 reverse 参数作为可选参数。

设置 reverse = True 将迭代器降序排序。

# 集合
py_set = {'e', 'a', 'u', 'o', 'i'}
print(sorted(py_set, reverse=True))

# 字典
py_dict = {'e': 1, 'a': 2, 'u': 3, 'o': 4, 'i': 5}
print(sorted(py_dict, reverse=True))

# 冻结集合
frozen_set = frozenset(('e', 'a', 'u', 'o', 'i'))
print(sorted(frozen_set, reverse=True))

输出

['u', 'o', 'i', 'e', 'a']
['u', 'o', 'i', 'e', 'a']
['u', 'o', 'i', 'e', 'a']

Python sorted() 函数中的 key 参数

如果您想要自己的排序实现,sorted() 还接受 key 函数作为可选参数。

基于 key 函数的返回值,您可以对给定的可迭代对象进行排序。

sorted(iterable, key=len)

这里,len() 是 Python 的内置函数,用于计算对象的长度。

列表根据元素的长度从最小到最大进行排序。

示例 3:使用带有 key 函数的 sorted() 排序列表

# 按第二个元素排序
def take_second(elem):
return elem[1]

# 随机列表
random = [(2, 2), (3, 4), (4, 1), (1, 3)]

# 带 key 的排序列表
sorted_list = sorted(random, key=take_second)

# 打印列表
print('排序后的列表:', sorted_list)

输出

排序后的列表: [(4, 1), (2, 2), (1, 3), (3, 4)]

示例 4:使用多个键排序

假设我们有以下列表:

# 科学奥林匹克的学生信息嵌套列表
# 列表元素:(学生姓名, 总分100, 年龄)
participant_list = [
('Alison', 50, 18),
('Terence', 75, 12),
('David', 75, 20),
('Jimmy', 90, 22),
('John', 45, 12)
]

我们希望按照这样的方式对列表进行排序:得分最高的学生排在前面。如果学生得分相等,则年龄较小的参赛者排在前面。

我们可以通过返回元组而不是数字来实现这种多键排序。

两个元组通过从第一个元素开始比较它们的元素来比较。如果有平局(元素相等),则比较第二个元素,依此类推。

>>> (1,3) > (1, 4)
False
>>> (1, 4) < (2,2)
True
>>> (1, 4, 1) < (2, 1)
True

让我们使用这个逻辑来构建我们的排序逻辑。

# 科学奥林匹克的学生信息嵌套列表
# 列表元素:(学生姓名, 总分100, 年龄)
participant_list = [
('Alison', 50, 18),
('Terence', 75, 12),
('David', 75, 20),
('Jimmy', 90, 22),
('John', 45, 12)
]

def sorter(item):
# 最高分优先,最小错误 = 最多分数
error = 100 - item[1]
age = item[2]
return (error, age)

sorted_list = sorted(participant_list, key=sorter)
print(sorted_list)

输出

[('Jimmy', 90, 22), ('Terence', 75, 12), ('David', 75, 20), ('Alison', 50, 18), ('John', 45, 12)]

由于排序逻辑函数小且适合单行,所以在 key 内部使用 lambda 函数而不是传递单独的函数名称。

上述程序可以使用 lambda 函数以下方式编写:

# 科学奥林匹克的学生信息嵌套列表
# 列表元素:(学生姓名, 总分100, 年龄)
participant_list = [
('Alison', 50, 18),
('Terence', 75, 12),
('David', 75, 20),
('Jimmy', 90, 22),
('John', 45, 12)
]

sorted_list = sorted(participant_list, key=lambda item: (100-item[1], item[2]))
print(sorted_list)

输出

[('Jimmy', 90, 22), ('Terence', 75, 12), ('David', 75, 20), ('Alison', 50, 18), ('John', 45, 12)]

要了解更多关于 lambda 函数的信息,请访问 Python Lambda 函数