在Python中如何使用sorted()和sort()函数

论坛 期权论坛 期权     
Python程序员   2019-6-9 21:25   2575   0

在某种程度上,所有的程序员都必须编写代码对项目或数据进行排序。在应用程序当中,排序对于用户体验而言是非常重要的,无论是按时间戳对用户最近的活动进行排序,还是按照姓氏的字母顺序排列电子邮件收件人列表。Python的排序功能十分强大,可以在粒度级别上进行基本排序或自定义排序。

在本教程中,你将会学习如何在不同的数据结构中对各种各样的数据类型进行排序和自定义排序,并使用Python中两种不同的排序方法。

在这篇教程结束时,你将会知道如何:
   1、在数据结构上完成基本的Python排序
   2、区分sorted()和.sort()函数
   3、基于特定的要求在编码中自定义一个复杂的排序

对于本篇教程而言,你需要对列表、元组以及集合有一个基础的理解。在本篇教程中,将会使用到这些数据结构,并且在这些数据结构上将会进行一些基础的操作。而且,这篇教程使用的是Python3的版本,所以如果你使用的是Python2的版本,输出样例可能会稍微有些差别。


使用sorted()函数排序

在开始使用Python进行排序之前,首先你要了解如何对数值和字符串数据进行排序。

对数值进行排序

你可以使用Python中的sorted()函数对一个列表进行排序。在本例中,定义了一个整数列表,然后调用sorted()函数,可变的numbers作为sorted()函数的参数。


输出结果是一个新的,有序的列表。当打印原始变量时,我们可以知道初始值并没有发生改变。
这个例子展示了sorted()函数四种重要的特性:
      1.sorted()函数不需要定义。它是一个内置函数,可以在标准的Python安装中使用。
      2.在没有额外的参数的情况下,sorted()函数按照升序对值进行排列,也就是按照从小到大的顺序。
      3.原始的numbers不会改变,因为sorted()函数提供了一个新的有序的输出结果,并且不改变原始值的顺序。
      4.当sorted()函数被调用时,它会提供一个有序的列表作为返回值。
最后一点意味着列表可以使用sorted()函数,并且输出结果可以立刻赋值给一个变量:


在这个例子中,有一个新的变量numbers_sorted存储了sorted()函数的输出结果。

你可以通过调用help()函数来查看sorted()函数以确认所有的这些观察结果。可选参数key和reverse将在本教程后面介绍:


技术细节:如果你正在从Python2过渡到Python3,并且对它的同名函数非常熟悉,你应该注意Python3中的几个重要变化:
        1.Python3中的sorted()函数没有cmp参数。相反,只使用key参数来引入自定义排序逻辑。
        2.key和reverse必须作为参数传递,这与Python2不同,在Python2中它们可以作为位置参数传递。

如果需要将Python2的cmp函数转换为key函数,请查看functools.cmp_to_key()。本教程将不介绍使用Python2的任何示例。

元组和集合同样可以使用sorted()函数:


值得注意的是即使输入的是一个集合和元组,输出结果仍然是一个列表,因为sorted()函数根据定义会返回一个新列表。如果返回的对象需要匹配输入类型,则可以将其转化为新类型。如果试图将结果列表转换回集合类型,请注意,按照定义而言,集合是无序的:


正如预料的结果一样,当把结果列表转换为集合时,numbers_set_sorted是无序的。其它的变量,如numbers_tuple_sorted保留了排序后的顺序。

对字符串进行排序

str类型的排序类似于列表和元组等其它可迭代对象。下面的例子展示了sorted()函数如何遍历传递给它的值中的每个字符并在输出中对字符进行排序:


sorted()函数将一个str看作一个列表,并遍历其中的每一个元素。在一个str中,每一个元素都对应着str中的一个字符。sorted()函数以相同的方式对待每一个句子,它会对每个字符包括空格进行排序。

.split()可以改变这个结果并清理输出,.join()可以将所有内容重新连接在一起。我们将会简单介绍输出的特定顺序以及为什么是这样:


在本例中,原句被转换为一个单词列表而不是作为一个str。然后,对该列表进行排序并再次组合形成一个str而不是一个列表。

Python排序的局限性和陷阱

值得注意的是,当你使用Python对非整数类型的值进行排序时,可能会出现一些限制和奇怪的结果。

含有不可比较数据类型的列表无法使用sorted()函数

有些数据类型不能使用sorted()函数相互比较,因为它们太不一样了。如果你试图对一个含有不可比较数据类型的列表使用sorted()函数,Python将会返回一个错误。在本例当中,同一个列表中的None和int不能排序,因为它们是不兼容的:


这个错误说明了为什么Python不能对给定的值进行排序。它试图通过使用小于操作符(
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:16
帖子:27
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP