跳到主要内容

Python 列表 sort() 方法

sort() 方法对列表中的元素进行升序或降序排序。

示例

prime_numbers = [11, 3, 7, 5, 2]

# 对列表进行升序排序
prime_numbers.sort()

print(prime_numbers)

# 输出: [2, 3, 5, 7, 11]

sort() 语法

sort() 方法的语法是:

list.sort(key=..., reverse=...)

另外,您也可以使用 Python 的内置 sorted() 函数达到相同的目的。

sorted(list, key=..., reverse=...)

注意: sort()sorted() 最简单的区别是:sort() 直接更改列表并且不返回任何值,而 sorted() 不改变列表并返回排序后的列表。

sort() 参数

默认情况下,sort() 不需要任何额外参数。然而,它有两个可选参数:

  • reverse - 如果为 True,则返回的排序列表是倒序的(或按降序排序)
  • key - 用作排序比较的键的函数

sort() 返回值

sort() 方法不返回任何值。相反,它更改了原始列表。

如果您希望函数返回排序后的列表而不是更改原始列表,请使用 sorted()

示例 1:对给定列表排序

# 元音列表
vowels = ['e', 'a', 'u', 'o', 'i']

# 对元音进行排序
vowels.sort()

# 打印元音
print('排序后的列表:', vowels)

输出

排序后的列表: ['a', 'e', 'i', 'o', 'u']

降序排序

sort() 方法接受 reverse 参数作为可选参数。

设置 reverse = True 将列表按降序排序。

list.sort(reverse=True)

对于 sorted(),您可以使用以下代码。

sorted(list, reverse=True)

示例 2:按降序排序列表

# 元音列表
vowels = ['e', 'a', 'u', 'o', 'i']

# 对元音进行排序
vowels.sort(reverse=True)

# 打印元音
print('排序后的列表(降序):', vowels)

输出

排序后的列表(降序): ['u', 'o', 'i', 'e', 'a']

使用 key 参数和自定义函数进行排序

如果您希望使用自己的实现进行排序,sort() 方法也接受一个 key 函数作为可选参数。

根据 key 函数的结果,您可以对给定列表进行排序。

list.sort(key=len)

对于 sorted,您可以使用以下代码:

sorted(list, key=len)

这里,len 是 Python 的内置函数,用于计算元素的长度。

列表将根据每个元素的长度从最小到最大排序。

我们知道,默认情况下,元组是根据其第一个参数排序的。让我们看看如何自定义 sort() 方法以使用第二个元素进行排序。

示例 3:使用 key 对列表排序

# 以第二个元素进行排序
def takeSecond(elem):
return elem[1]

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

# 使用 key 对列表排序
random.sort(key=takeSecond)

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

输出

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

让我们再看一个例子。假设我们有一个关于办公室员工的信息列表,其中每个元素都是一个字典。

我们可以按以下方式对列表进行排序:

# 使用自定义 key 进行排序
employees = [
{'Name': 'Alan Turing', 'age': 25, 'salary': 10000},
{'Name': 'Sharon Lin', 'age': 30, 'salary': 8000},
{'Name': 'John Hopkins', 'age': 18, 'salary': 1000},
{'Name': 'Mikhail Tal', 'age': 40, 'salary': 15000},
]

# 自定义函数以获取员工信息
def get_name(employee):
return employee.get('Name')

def get_age(employee):
return employee.get('age')

def get_salary(employee):
return employee.get('salary')

# 按姓名排序(升序)
employees.sort(key=get_name)
print(employees, end='\n\n')

# 按年龄排序(升序)
employees.sort(key=get_age)
print(employees, end='\n\n')

# 按薪资排序(降序)
employees.sort(key=get_salary, reverse=True)
print(employees, end='\n\n')

输出

[{'Name': 'Alan Turing', 'age': 25, 'salary': 10000}, {'Name': 'John Hopkins', 'age': 18, 'salary': 1000}, {'Name': 'Mikhail Tal', 'age': 40, 'salary': 15000}, {'Name': 'Sharon Lin', 'age': 30, 'salary': 8000}]

[{'Name': 'John Hopkins', 'age': 18, 'salary': 1000}, {'Name': 'Alan Turing', 'age': 25, 'salary': 10000}, {'Name': 'Sharon Lin', 'age': 30, 'salary': 8000}, {'Name': 'Mikhail Tal', 'age': 40, 'salary': 15000}]

[{'Name': 'Mikhail Tal', 'age': 40, 'salary': 15000}, {'Name': 'Alan Turing', 'age': 25, 'salary': 10000}, {'Name': 'Sharon Lin', 'age': 30, 'salary': 8000}, {'Name': 'John Hopkins', 'age': 18, 'salary': 1000}]

在第一个案例中,我们的自定义函数返回每个员工的姓名。由于姓名是 字符串,Python 默认按字母顺序对其进行排序。

在第二个案例中,返回年龄(int 类型)并按升序

排序。

在第三个案例中,函数返回薪资(int 类型),并使用 reverse = True 按降序排序。

当函数可以用一行概括时,使用 lambda 函数是一个好习惯。因此,我们也可以将上面的程序写成:

# 使用自定义 key 进行排序
employees = [
{'Name': 'Alan Turing', 'age': 25, 'salary': 10000},
{'Name': 'Sharon Lin', 'age': 30, 'salary': 8000},
{'Name': 'John Hopkins', 'age': 18, 'salary': 1000},
{'Name': 'Mikhail Tal', 'age': 40, 'salary': 15000},
]

# 按姓名排序(升序)
employees.sort(key=lambda x: x.get('Name'))
print(employees, end='\n\n')

# 按年龄排序(升序)
employees.sort(key=lambda x: x.get('age'))
print(employees, end='\n\n')

# 按薪资排序(降序)
employees.sort(key=lambda x: x.get('salary'), reverse=True)
print(employees, end='\n\n')

输出

[{'Name': 'Alan Turing', 'age': 25, 'salary': 10000}, {'Name': 'John Hopkins', 'age': 18, 'salary': 1000}, {'Name': 'Mikhail Tal', 'age': 40, 'salary': 15000}, {'Name': 'Sharon Lin', 'age': 30, 'salary': 8000}]

[{'Name': 'John Hopkins', 'age': 18, 'salary': 1000}, {'Name': 'Alan Turing', 'age': 25, 'salary': 10000}, {'Name': 'Sharon Lin', 'age': 30, 'salary': 8000}, {'Name': 'Mikhail Tal', 'age': 40, 'salary': 15000}]

[{'Name': 'Mikhail Tal', 'age': 40, 'salary': 15000}, {'Name': 'Alan Turing', 'age': 25, 'salary': 10000}, {'Name': 'Sharon Lin', 'age': 30, 'salary': 8000}, {'Name': 'John Hopkins', 'age': 18, 'salary': 1000}]

推荐阅读