使用 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。
如果一个或多个字符串具有相同的第一个字符,则会比较它们的第二个和后续字符,直到找到某种顺序。 这是一个代码示例,我们对人名进行排序。
# 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)
在这个例子中,我们有一个字典对象代表三个人。 每个对象都有一个名称和年龄属性。 我们想按年龄对人进行排序。 因此,当我们调用排序函数时,我们传入一个函数作为关键参数。
该函数将接受一个人的字典对象并返回该人的年龄。 该键的返回值将用于排序。 因此整个字典被概括为一个可以比较的简单整数。 为简单起见,我使用 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 函数的文章。