了解 Python 中的排序函数:简单指南

使用 Python 的一大好处是它的简单性。 使用它很容易,因为它的标准库有许多有用的函数。 排序函数就是这样的函数之一。

该函数用于按某种顺序对可迭代对象进行排序。 如果没有这样的函数,则必须编写实现排序算法(例如冒泡排序或插入排序)的代码。 这通常很困难,但 Python 提供了一种更简单的方法,我们将在本文中介绍。

排序函数简介

Sorted函数是Python中对可迭代对象进行排序的函数。 可迭代对象是可以循环的任何值。 可迭代的示例包括字符串、列表、元组和集合。 这些可迭代对象通常是无序的,排序会将它们的值按某种指定的顺序排列。 对值进行排序很有帮助,因为:

  • 使用二分搜索等算法可以更快、更高效地进行值搜索。 然而,二分查找要求首先对值进行排序。
  • 显示值。 有时,用户希望按顺序查看信息,例如,首先查看最低价格或首先查看最近的帖子。 这需要实现某种对值列表进行排序的方法。
  • 例如,在执行统计分析时,查找一组中最常出现的值。 当值按顺序排序时,这样做会更容易。

排序函数使用指南

如前所述,排序函数适用于所有可迭代对象。 反过来,它返回一个已排序的列表。 值得注意的是——虽然输入可以是任何可迭代的,但返回值必须始终是一个列表。

排序函数的语法

排序函数的函数签名如下:

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

正如您所看到的,唯一必需的参数是可迭代的,它将被排序。

下面的论证是关键。 键是一个函数,用于转换可迭代中的每个元素以获得用于排序的值。 这对于对字典列表进行排序非常有用,稍后您将看到。 默认值为 none,因此除非指定,否则不会应用任何函数。

最后一个参数是相反的参数。 当设置为 true 时,项目将以相反的顺序排序。

在下一节中,我将通过示例来演示如何使用该功能。

排序函数使用示例

号码列表

对值进行排序的最简单的情况是对数字列表进行排序。 考虑以下代码示例:

# A list of unsorted values
numbers = [8, 4, 3, 9, 2, 0, 3]

# Sorting the numbers
sorted_numbers = sorted(numbers)

# Outputting the sorted values
print(sorted_numbers)

输出将是:

[0, 2, 3, 3, 4, 8, 9]

正如您所看到的,这些值已按升序排序。 如果你想按降序对它们进行排序,你可以将reverse设置为true。 因此,前面的代码示例中的第 4 行将是:

sorted_numbers = sorted(numbers, reverse=True)

运行修改后的程序的输出将是:

[9, 8, 4, 3, 3, 2, 0]

字符串列表

排序函数不仅仅支持数字。 您还可以对字符串进行排序。 要对列表中的字符串进行排序,需要比较字符串的第一个字符。 比较是对字符的 ASCII 值进行的。 例如,“hello”会出现在“world”一词之前,因为“h”的 ASCII 值为 104,小于“w”的 ASCII 值 119。

  9 个适合初学者的手语学习应用程序

如果一个或多个字符串具有相同的第一个字符,则会比较它们的第二个和后续字符,直到找到某种顺序。 这是一个代码示例,我们对人名进行排序。

# Creating a list of names
members_list = ['bob', 'dave', 'charlie', 'alice']

# Sorting the names
sorted_members_list = sorted(members_list)

# Printing the names
print(sorted_members_list)

这将产生以下输出:

['alice', 'bob', 'charlie', 'dave']

由于使用 ASCII 值,因此字符串的顺序取决于 ASCII 表中第一个字符。 例如,大写字符会出现在小写字符之前,因为在 ASCII 中大写字符出现在小写字母之前。 这是一个完整的 ASCII 表供您参考:

资料来源:commons.wikimedia.org

其他可迭代对象——字符串、元组和集合

正如我所提到的,排序函数适用于各种可迭代对象。 相同的规则适用于如何对迭代中的值进行排序。 这是一个例子:

# Printing a sorted string
print(sorted("dijkstra"))

# Printing a sorted tuple of values
print(sorted((3, 4, 2, 1, 5, 0)))

# Printing a sorted set of values
print(sorted(set([4, 5, 5, 1, 3, 8, 9])))

其输出将是:

['a', 'd', 'i', 'j', 'k', 'r', 's', 't']
[0, 1, 2, 3, 4, 5]
[1, 3, 4, 5, 8, 9]

如您所见,每种情况的输出都是一个列表。

词典列表

您还可以应用排序函数对字典列表进行排序。 然而,对字典进行排序有点复杂。 这是因为,与数字或字符串不同,字典具有多个属性,每个属性对于比较同样有效。

因此,要对字典进行排序,您可以指定一个函数,该函数会将整个字典汇总为一个用于比较的值。 该函数将作为键参数传递给排序函数。 下面举一个例子来说明:

people = [
        { 'name': 'Alice', 'age': 27 },
        { 'name': 'Bob', 'age':  23 },
        { 'name': 'Charlie', 'age': 25}
]

people_sorted_by_age = sorted(people, key=lambda person: person['age'])
print(people_sorted_by_age)

在这个例子中,我们有一个字典对象代表三个人。 每个对象都有一个名称和年龄属性。 我们想按年龄对人进行排序。 因此,当我们调用排序函数时,我们传入一个函数作为关键参数。

  使用这 9 个平台为您的网站获取广告服务器

该函数将接受一个人的字典对象并返回该人的年龄。 该键的返回值将用于排序。 因此整个字典被概括为一个可以比较的简单整数。 为简单起见,我使用 lambda 函数来定义关键参数。

运行代码将产生以下输出:

[{'name': 'Bob', 'age': 23}, {'name': 'Charlie', 'age': 25}, {'name': 'Alice', 'age': 27}]

关键参数用例

仅在对字典进行排序时不必使用 key 参数。 您可以将它用于所有值。 它的用途是提供一个可用于对值进行排序的键。 以下是示例用例:

  • 通过定义一个接受值并返回值的长度的键函数对值进行排序。
  • 以不区分大小写的方式对列表中的字符串进行排序。 为此,可以将列表中的每个字符串转换为小写。 这可以通过定义一个键函数来实现,该函数接受字符串的键值并返回该字符串的小写版本。
  • 根据组合其他条目的值的复合值对值进行排序。

排序函数的运行时复杂性

排序函数的运行时复杂度为 O(n log n),其中 n 是输入可迭代中的元素数量。 出现这种复杂性是因为该函数使用 Timsort 算法,该算法是基于合并排序和插入排序的混合排序算法。

该函数的空间复杂度为 O(n),其中 n 仍然是输入中的元素数量。 这是因为创建并返回了一个新列表。

排序函数与排序函数

对值进行排序的另一个选项是排序函数。 本节将解释排序函数和排序函数之间的主要区别。

  • 排序函数会就地修改迭代,而排序函数会创建一个新列表并返回该列表。
  • 由于修改是就地进行的,因此排序要求输入是列表。 另一方面,sorted 可以将任何可迭代对象作为输入,然后将其用于创建一个将被修改并返回的新列表。

最后的话

在本文中,我们介绍了排序函数 – 它是什么、如何使用它以及它接受的不同参数。我们还介绍了该函数的不同使用示例及其运行时复杂性,并将其与排序函数进行了比较。

接下来,您可能想阅读我们关于 Python 的 Sum 函数的文章。