英文:Python .sort() – How to Sort a List in Python,作者:Dionysia Lemonaki

在本文中,你将学习如何使用 Python 的 sort() 列表方法。

你还将学习使用 sorted() 函数在 Python 中执行排序的不同方式,以便了解它与 sort() 的不同之处。

最后,你将了解在 Python 中对列表进行排序的基础知识,并了解如何自定义排序以满足你的需求。

以下是我们将介绍的内容:

  • sort 方法的语法
  • 按升序对列表项进行排序
  • 按降序对列表项进行排序
  • 使用 key 参数对列表项进行排序
  • sort()sorted() 的区别
  • 何时使用 sort()sorted()

sort() 方法 - 语法概述

sort() 方法是在 Python 中对列表进行排序的方法之一。

使用 sort() 时,你对列表进行就地排序。这意味着直接修改了原始列表。具体来说,元素的原始顺序被改变。

sort() 方法的一般语法如下所示:

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

让我们分解一下:

  • list_name 是你正在使用的列表的名称。
  • sort() 是 Python 的列表方法之一,用于对列表进行排序和更改。它按升序或降序对列表元素进行排序。
  • sort() 接受两个可选参数。
  • reverse 是第一个可选参数。它指定列表是按升序还是降序排序。它需要一个布尔值,这意味着该值为 True 或 False。默认值为 False,表示列表按升序排序。将其设置为 True 会按降序对列表进行降序排序。
  • key 是第二个可选参数。它需要一个函数或方法,用于指定你可能有的任何详细排序标准。

sort() 方法返回 None,这意味着没有返回值,因为它只是修改了原始列表。它不会返回新列表。

如何使用 sort() 方法按升序对列表项进行排序

如前所述,默认情况下,sort() 按升序对列表项进行排序。

升序(或升序)意味着项目从最低值到最高值排列。

最低值在左侧,最高值在右侧。

执行此操作的一般语法类似于以下内容:

list_name.sort()

让我们看一下以下示例,该示例显示了如何对整数列表进行排序:

# 一个数字的列表
my_numbers = [10, 8, 3, 22, 33, 7, 11, 100, 54]

# 按升序对列表进行就地排序
my_numbers.sort()

# 打印修改后的列表
print(my_numbers)

# 输出

#[3, 7, 8, 10, 11, 22, 33, 54, 100]

在上面的示例中,数字从小到大排序。

在使用字符串列表时,你也可以达到同样的效果:

# 一个字符串的列表
programming_languages = ["Python", "Swift","Java", "C++", "Go", "Rust"]

# 按字母顺序对列表进行就地排序
programming_languages.sort()

# 打印修改后的列表
print(programming_languages)

# 输出

#['C++', 'Go', 'Java', 'Python', 'Rust', 'Swift']

在这种情况下,列表中包含的每个字符串都按字母顺序排序。

正如你在两个示例中看到的,原始列表直接被更改。

如何使用 sort() 方法以降序对列表项进行排序

降序(或降序)与升序相反 - 元素从最高值到最低值排列。

要按降序对列表项进行排序,你需要在 sort() 方法中使用可选的 reverse 参数,并将其值设置为 True

执行此操作的一般语法如下所示:

list_name.sort(reverse=True)

让我们重用上一节中的相同示例,但这次让数字以相反的顺序排序:

# 一个数字的列表
my_numbers = [10, 8, 3, 22, 33, 7, 11, 100, 54]

# 按降序对列表进行就地排序
my_numbers.sort(reverse=True)

# 打印修改后的列表
print(my_numbers)

# 输出

#[100, 54, 33, 22, 11, 10, 8, 7, 3]

现在所有的数字都颠倒了,最大值在左边,最小值在右边。

在使用字符串列表时,你也可以达到同样的效果。

# 一个字符串的列表
programming_languages = ["Python", "Swift","Java", "C++", "Go", "Rust"]

# 按字母降序对列表进行就地排序
programming_languages.sort(reverse=True)

# 打印修改后的列表
print(programming_languages)

# 输出

#['Swift', 'Rust', 'Python', 'Java', 'Go', 'C++']

列表项现在按字母降序排列。

如何使用带有 key 参数的 sort() 方法对列表项进行排序

你可以使用 key 参数执行更多自定义排序操作​​。

分配给 key 参数的值必须是可调用的,也就是说它可以被调用和引用。

可调用对象的一些示例是方法和函数。

分配给 key 的这个方法或函数将在任何排序发生之前应用于列表中的所有元素,并将指定排序条件的逻辑。

假设你想根据字符串的长度对字符串列表进行排序。

为此,你将内置 len() 函数分配给 key 参数。

len() 函数将通过计算该元素中包含的字符来计算存储在列表中的每个元素的长度。

programming_languages = ["Python", "Swift","Java", "C++", "Go", "Rust"]

programming_languages.sort(key=len)

print(programming_languages)

# 输出

#['Go', 'C++', 'Java', 'Rust', 'Swift', 'Python']

在上面的示例中,字符串按默认升序排序,但这次排序是根据它们的长度进行的。

最短的字符串在左边,最长的在右边。

还可以组合 keyreverse 参数。

例如,你可以根据列表项的长度但按降序对列表项进行排序。

programming_languages = ["Python", "Swift","Java", "C++", "Go", "Rust"]

programming_languages.sort(key=len, reverse=True)

print(programming_languages)

# 输出

#['Python', 'Swift', 'Java', 'Rust', 'C++', 'Go']

在上面的示例中,字符串从最长到最短。

另一件需要注意的是,你可以创建自己的自定义排序函数,以创建更明确的排序标准。

例如,你可以创建一个特定的函数,然后根据该函数的返回值对列表进行排序。

假设你有一个包含编程语言的词典列表以及每种编程语言的创建年份。

programming_languages = [{'language':'Python','year':1991},
{'language':'Swift','year':2014},
{'language':'Java', 'year':1995},
{'language':'C++','year':1985},
{'language':'Go','year':2007},
{'language':'Rust','year':2010},
]

你可以定义一个自定义函数,从字典中获取特定键的值。

💡 请记住,字典键和 sort() 接受的 key 参数是两个不同的东西!

具体来说,该函数将获取并返回字典列表中年份 key 的值,该值指定字典中每种语言的创建年份。

然后,返回值将用作列表的排序标准。

programming_languages = [{'language':'Python','year':1991},
{'language':'Swift','year':2014},
{'language':'Java', 'year':1995},
{'language':'C++','year':1985},
{'language':'Go','year':2007},
{'language':'Rust','year':2010},
]

def get_year(element):
    return element['year']

然后,你可以根据之前创建的函数的返回值进行排序,方法是将其分配给 key 参数,并按默认的升序时间顺序进行排序:

programming_languages = [{'language':'Python','year':1991},
{'language':'Swift','year':2014},
{'language':'Java', 'year':1995},
{'language':'C++','year':1985},
{'language':'Go','year':2007},
{'language':'Rust','year':2010},
]

def get_year(element):
    return element['year']

programming_languages.sort(key=get_year)

print(programming_languages)

输出:

[{'language': 'C++', 'year': 1985}, {'language': 'Python', 'year': 1991}, {'language': 'Java', 'year': 1995}, {'language': 'Go', 'year': 2007}, {'language': 'Rust', 'year': 2010}, {'language': 'Swift', 'year': 2014}]

如果要从最近创建的语言到最旧的语言排序,或者按降序排列,则使用 reverse=True 参数:

programming_languages = [{'language':'Python','year':1991},
{'language':'Swift','year':2014},
{'language':'Java', 'year':1995},
{'language':'C++','year':1985},
{'language':'Go','year':2007},
{'language':'Rust','year':2010},
]

def get_year(element):
    return element['year']

programming_languages.sort(key=get_year, reverse=True)

print(programming_languages)

输出:

[{'language': 'Swift', 'year': 2014}, {'language': 'Rust', 'year': 2010}, {'language': 'Go', 'year': 2007}, {'language': 'Java', 'year': 1995}, {'language': 'Python', 'year': 1991}, {'language': 'C++', 'year': 1985}]

要获得完全相同的结果,你可以创建一个 lambda 函数。

除了使用你使用 def 关键字定义的常规自定义函数,你还可以:

  • 创建一个简洁的单行表达式,
  • 而不是像使用 def 函数那样定义函数名。Lambda 函数也叫作匿名函数。
programming_languages = [{'language':'Python','year':1991},
{'language':'Swift','year':2014},
{'language':'Java', 'year':1995},
{'language':'C++','year':1985},
{'language':'Go','year':2007},
{'language':'Rust','year':2010},
]

programming_languages.sort(key=lambda element: element['year'])

print(programming_languages)

使用 key=lambda element: element['year'] 指定的 lambda 函数将这些编程语言从最旧到最新排序。

sort() 和 sorted() 的区别

sort() 方法的工作方式与 sorted() 函数类似。

sorted() 函数的一般语法如下所示:

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

让我们分解一下:

  • sorted() 是一个接受迭代的内置函数,然后它按升序或降序对其进行排序。
  • sorted() 接受三个参数,一个参数是必需的,另外两个是可选的。
  • list_name 是必需的参数。在这种情况下,参数是列表,但 sorted() 接受任何其他可迭代对象。
  • sorted() 还接受可选参数 reversekey,这与 sort() 方法接受的可选参数相同。
  • sort()sorted() 之间的主要区别在于 sorted() 函数接受一个列表并返回一个新的排序副本。

新副本按排序顺序包含原始列表的元素。

原始列表中的元素不受影响,保持不变。

因此,总结一下差异:

  • sort() 方法没有返回值,直接修改原始列表,改变其中包含的元素的顺序。
  • 另一方面,sorted() 函数有一个返回值,它是原始列表的排序副本。该副本按排序顺序包含原始列表的列表项。最后,原始列表保持不变。

让我们看一下下面的例子,看看它是如何运行的:

# 原始数字列表
my_numbers = [10, 8, 3, 22, 33, 7, 11, 100, 54]

# 按默认升序对原始列表进行排序
my_numbers_sorted = sorted(my_numbers)

# 打印原始列表
print(my_numbers)

# 打印创建的原始列表的副本
print(my_numbers_sorted)

# 输出

#[10, 8, 3, 22, 33, 7, 11, 100, 54]
#[3, 7, 8, 10, 11, 22, 33, 54, 100]

由于没有为 sorted() 提供额外的参数,它以默认的升序对原始列表的副本进行排序,从最小值到最大值。

在打印原始列表时,你会看到它保持不变,并且项目具有原始顺序。

正如你在上面的示例中看到的,列表的副本被分配给一个新变量 my_numbers_sorted

sort() 无法完成类似的事情。

查看以下示例,看看如果尝试使用 sort() 方法会发生什么。

my_numbers = [10, 8, 3, 22, 33, 7, 11, 100, 54]

my_numbers_sorted = my_numbers.sort()

print(my_numbers)
print(my_numbers_sorted)

# 输出

#[3, 7, 8, 10, 11, 22, 33, 54, 100]
#None

你会看到 sort() 的返回值为 None

最后,需要注意的另一件事是 sorted() 函数接受的 reverse 参数和 key 参数的工作方式与你在前面部分中看到的 sort() 方法完全相同。

何时使用 sort() 和 sorted()

下面列出了在决定是否应该使用 sort()sorted() 时可能需要考虑的一些事项。

首先,考虑你正在使用的数据类型:

  • 如果你从一开始就严格使用列表,那么你将需要使用 sort() 方法,因为 sort() 仅在列表上调用。
  • 另一方面,如果你想要更大的灵活性并且还没有使用列表,那么你可以使用 sorted()sorted() 函数接受并排序任何可迭代对象(如字典、元组和集合),而不仅仅是列表。

接下来,要考虑的另一件事是保留正在使用的列表的原始顺序是否重要:

  • 调用 sort() 时,原来的列表会被改变,原来的顺序会丢失。你将无法检索列表元素的原始位置。当你确定要更改你正在使用的列表并且确定你不想保留它的顺序时,请使用 sort()
  • 另一方面,当你想创建一个新列表但仍想保留正在使用的列表时, sorted() 很有用。sorted() 函数将创建一个新的排序列表,其中列表元素按所需顺序排序。

最后,在处理更大的数据集时可能需要考虑的另一件事是时间和内存效率:

  • sort() 方法占用并消耗更少的内存,因为它只是对列表进行就地排序并且不会产生你不需要的新列表。出于同样的原因,它也稍微快一些,因为它不创建副本。当你使用包含更多元素的较大列表时,这会很有帮助。

总结

你现在知道如何在 Python 中使用 sort() 方法对列表进行排序。

你还了解了使用 sort()sorted() 对列表进行排序之间的主要区别。

我希望你觉得这篇文章有用。

要了解有关 Python 编程语言的更多信息,请查看 freeCodeCamp 的 Python 和科学计算认证课程

你将从基础开始,通过对初学者友好的交互式课程来学习。最后,你还将构建五个项目以巩固你所学的知识。

感谢你阅读本文,祝你编程愉快!