理解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表供您参考:

来源:commons.wikimedia.org

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

如前所述,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函数的文章。

类似文章