理解Python中的Sorted函数:一个简单指南
使用python的一个伟大优点之一是它的简单性。由于其标准库具有许多有用的函数,因此很容易与它一起工作。其中一个函数就是sorted函数。
此函数用于按某个顺序对可迭代对象进行排序。如果没有这样的函数,就必须编写实现排序算法(如冒泡排序或插入排序)的代码。这通常很困难,但python提供了一种更简单的方法,我们将在本文中介绍。
对sorted函数的介绍
sorted函数是python中排序可迭代对象的函数。可迭代对象是可以循环访问的任何值。可迭代对象的示例包括字符串、列表、元组和集合。这些可迭代对象通常是无序的,排序将它们的值放在某个指定的顺序中。排序值很有帮助,因为:
- 使用二分搜索等算法进行值搜索更快、更高效。但是,二分搜索要求先对值进行排序。
- 显示值。有时用户希望按顺序查看信息,例如,首先显示最低价格或最新的帖子。这需要实现一种对值列表进行排序的方法。
- 进行统计分析,例如在集合中找到最常出现的值。当值按顺序排序时,这样做会更容易。
sorted函数使用指南
如前所述,sorted函数适用于所有可迭代对象。反过来,它返回一个已排序的列表。这一点很重要 – 虽然输入可以是任何可迭代对象,但返回值必须始终是一个列表。
sorted函数的语法
sorted函数的函数签名如下:
sorted(iterable, key=none, reverse=false)
如您所见,唯一必需的参数是要排序的可迭代对象。
在此之后的参数是key。key是一个函数,将用于转换可迭代对象中的每个元素,以获得用于排序的值。后面将看到,这对于对字典列表进行排序将很有用。默认值为none,因此除非指定,否则不会应用任何函数。
最后一个参数是reverse参数。当设置为true时,项目将以相反的顺序排序。
在下一节中,我将使用示例来演示如何使用该函数。
sorted函数使用示例
数字列表
对值进行排序的最简单情况是对数字列表进行排序。考虑以下代码示例:
# 一个未排序的值列表
numbers = [8, 4, 3, 9, 2, 0, 3]
# 对数字进行排序
sorted_numbers = sorted(numbers)
# 输出排序后的值
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]
字符串列表
sorted函数不仅支持数字,还支持字符串的排序。要对字符串列表进行排序,将比较字符串的第一个字符。比较是根据字符的ascii值进行的。例如,'hello'会排在单词'world'之前,因为'h'的ascii值是104,小于'w'的ascii值119。
如果一个或多个字符串具有相同的第一个字符,则将比较它们的第二个字符和后续字符,直到找到某种顺序为止。下面是一个代码示例,用于对人名进行排序。
# 创建人名列表
members_list = ['bob', 'dave', 'charlie', 'alice']
# 对人名进行排序
sorted_members_list = sorted(members_list)
# 打印人名
print(sorted_members_list)
这将产生以下输出:
['alice', 'bob', 'charlie', 'dave']
由于使用的是ascii值,字符串的排序取决于哪个字符在ascii表中出现在前面。例如,大写字符会排在小写字符之前,因为在ascii中大写字符出现在小写字母之前。以下是完整的ascii表供您参考:
其他可迭代对象 – 字符串、元组和集合
如前所述,sorted函数适用于各种可迭代对象。对于如何对可迭代对象中的值进行排序,适用相同规则。以下是一个示例:
# 打印排序后的字符串
print(sorted("dijkstra"))
# 打印排序后的值元组
print(sorted((3, 4, 2, 1, 5, 0)))
# 打印排序后的值集合
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]
如您所见,每种情况的输出都是一个列表。
字典列表
您还可以将sorted函数应用于对字典列表进行排序。但是,对字典进行排序要复杂一些。这是因为与数字或字符串不同,字典具有多个属性,每个属性对比都是同样有效的。
因此,要对字典进行排序,您需要指定一个函数,将整个字典汇总为一个用于比较的值。将此函数作为key参数传递给sorted函数。以下示例将说明:
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)
在这个示例中,我们有三个用字典对象表示的人。每个对象都有一个名字和年龄属性。我们想按照年龄对人进行排序。因此,当我们调用sorted函数时,我们将一个函数作为key参数传入。
这个函数将接受一个人的字典对象,并返回这个人的年龄。这个key的返回值将用于排序。因此,整个字典已经被总结成一个可以进行比较的简单整数。为了简单起见,我使用了一个lambda函数来定义key参数。
运行代码将产生以下输出:
[{'name': 'bob', 'age': 23}, {'name': 'charlie', 'age': 25}, {'name': 'alice', 'age': 27}]
使用key参数的用例
key参数不仅限于对字典进行排序。您可以对所有值使用它。它的用途是提供一个可以用于排序值的键。以下是示例用例:
- 通过定义一个接受值并返回值长度的key函数来对值进行排序。
- 以不区分大小写的方式对列表中的字符串进行排序。为此,列表中的每个字符串可以转换为小写。这可以通过定义一个接受字符串的键值并返回字符串的小写版本的key函数来实现。
- 根据将其他条目的值组合起来的复合值对值进行排序。
sorted函数的运行时复杂度
sorted函数的运行时复杂度为o(n log n),其中n是输入可迭代对象中的元素数量。这个复杂度是由于函数使用了timsort算法,这是一种基于归并排序和插入排序的混合排序算法。
函数的空间复杂度为o(n),其中n仍然是输入中的元素数量。这是因为创建了一个新的列表并返回。
sorted函数与sort函数的区别
对于排序值,另一个选项是使用sort函数。本节将解释sorted和sort函数之间的主要区别。
- sort函数会就地修改可迭代对象,而sorted函数会创建一个新的列表并返回。
- 由于修改是就地进行的,sort要求输入为列表。另一方面,sorted可以接受任何可迭代对象作为输入,然后用它来创建一个新列表,该新列表将被修改和返回。
最后的话
在本文中,我们介绍了sorted函数-它是什么,如何使用它以及它接受的不同参数。我们还介绍了函数的不同用法示例、它的运行时复杂度,并将其与sort函数进行了比较。
接下来,您可能想阅读我们关于python的sum函数的文章。