2.3.4 sorted()函数

排序是程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心都是比较两个元素的大小。如果用于排序的是数字,可以直接比较,但如果是字符串或者字典,直接比较数学上的大小是没有意义的,因此比较的过程必须通过函数抽象出来。

Python内置的sorted()函数可以对列表进行排序:

     sorted([12, 2, -2, 8, -16])

运行上述代码,输出为“[-16, -2, 2, 8, 12]”。

此外,sorted()函数可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序,代码如下:

     sorted([12, 2, -2, 8, -16],key=abs)

运行上述代码,输出为“[2, -2, 8, 12, -16]”。

用key指定的函数将作用于列表的每一个元素上,并根据key函数返回的结果进行排序。

我们再看一个字符串排序的例子,代码如下:

     sorted(['Month', 'year', 'Day', 'hour'])

运行上述代码,输出为“['Day', 'Month', 'hour', 'year']”。

默认情况下,对字符串的排序是按照字符串中字符的ASCII编码的大小来排序的,大写字母会排在小写字母的前面。

现在,我们提出排序忽略大小写,按照字母顺序排序。要实现这个算法,不必对现有代码大加改动,只要我们能用一个key函数把字符串映射为忽略字母大小写的排序即可。忽略字母大小写来比较两个字符串,实际上就是先把字符串中的字母都变成大写字母(或者都变成小写字母),然后再进行比较。

这样,我们给sorted()函数传入key函数,即可实现忽略字母大小写进行排序:

     sorted(['Month', 'year', 'Day', 'hour'],key=str.lower)

运行上述代码,输出为“['Day', 'hour', 'Month', 'year']”。

要进行反向排序,不必改动key函数,传入第三个参数reverse=True即可:

     sorted(['Month', 'year', 'Day', 'hour'], key=str.lower, reverse=True)

运行上述代码,输出为“['year', 'Month', 'hour', 'Day']”。