Python的排序操作

标签:Python

昨晚写聊天室时,遇到一个排序的问题,所以便稍作研究,记录了下来。

先看sorted(iterable[, cmp[, key[, reverse]]])这个内建函数,它会返回iterable排序后的列表。看上去参数很多,所以慢慢研究。
如果iterable中的对象本身就定义了比较函数,且需要升序排列,那么就不需要其他参数:
>>> l = range(10, 0, -1)
>>> l
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> sorted(l)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
如果对象没有定义比较函数,或者默认的比较函数不适用,那可能就需要传入cmp参数。
cmp参数是一个callable的对象,它接受2个参数,并返回比较值:负数表示第一个参数小,正数表示第一个参数大,0表示相等。默认情况下,cmp这个内建函数就是这样做的。
下面就是一个不区分大小写的排序,方法就是把参数先转成小写或大写,然后再用cmp函数来比较:
>>> l = ['a', 'b', 'c', 'A', 'B', 'C']
>>> sorted(l)
['A', 'B', 'C', 'a', 'b', 'c']
>>> sorted(l, cmp=lambda x, y: cmp(x.lower(), y.lower()))
['a', 'A', 'b', 'B', 'c', 'C']
如果对象本身没有定义比较函数,但可将对象转换成另一个可排序的对象,那么用key参数将比cmp参数更方便。
key参数也是一个callable的对象,它将排序的对象传入这个key函数,再根据返回值进行排序。
例如str.lower可以接收一个字符串对象,并返回它的小写形式,于是这也符合要求:
>>> l = ['a', 'b', 'c', 'A', 'B', 'C']
>>> sorted(l, key=str.lower)
['a', 'A', 'b', 'B', 'c', 'C']
如果你只是想将默认的升序排列改成降序排列,那么用reverse参数是最方便的:
>>> l= range(10)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> sorted(l, reverse=True)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
再来看看昨天我写聊天室程序时用到的排序:
sorted([message for message in messages if message['id'] > id], key=lambda message: message['id'], reverse=True)
列表里的不用管,只是一个过滤。key传递的是一个lambda函数,直接将message的id返回,便可实现对id进行排序了。最后做个倒序排列,便大功告成。
同理,如果要对字典进行排序的话,转换成列表,然后把key或value返回给key参数,便能很简单地实现了。

此外,就是列表、数组本身还提供了sort方法,使用大同小异,只不过不是返回新列表,而是直接操作本身。

至于Python所用的排序算法,这里有篇博文可以参考:学习笔记:Python的排序

0条评论 你不来一发么↓

    想说点什么呢?