python: sort和sorted()方法

python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列。

sorted语法结构

sorted(...)
    sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list 
iterable:为可迭代序列

cmp 和 key 均为比较函数,在python2.4前,sorted()和list.sort()函数没有提供key参数,但是提供了cmp参数来让用户指定比较函数。

reverse:为排序方向,False为正序,True为反序

基本用法

list 排序

sort () 方法会修改原有的list

>>> a = [2,4,5,3,1]
>>> a.sort()
>>> a
[1, 2, 3, 4, 5]

sorted()方法会生成新的list,不会改变原有的list

>>> a = [2,4,5,3,1]
>>> sorted(a)
[1, 2, 3, 4, 5]
>>> a
[2, 4, 5, 3, 1]
此外sorted()方法对所有的可迭代序列都有效

>>> sorted({1:'b',2:'d',3:'e',4:'g',5:'f'})
[1, 2, 3, 4, 5]

key参数/函数

key参数的值为一个函数,此函数只有一个参数且返回一个值用来进行比较。这个技术是快速的因为key指定的函数将准确地对每个元素调用。

例如通过key指定的函数来忽略字符串的大小写

>>> sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

用复杂对象的某些值来对复杂对象的序列排序

如:对学生的按姓名排序

>>> student_tuples = [('john','A',15),('jane', 'B', 12),('dave', 'B', 10),]
>>> sorted(student_tuples, key=lambda student: student[0])
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
Operator 模块函数
operator模块有itemgetter,attrgetter,从2.6开始还增加了methodcaller方法,使操作起来更加简单

>>> from operator import itemgetter,attrgetter
>>> sorted(student_tuples, key=itemgetter(2)) #按照年龄排序
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(student_tuples, key=itemgetter(0)) #按照姓名排序
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15

升序和降序
list.sort()和sorted()都接受一个参数reverse(True or False)来表示升序或降序排序。

例如对上面的student年龄降序排序如下:

>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(student_tuples, key=itemgetter(2),reverse=True) #降序排序
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

本文主要参考:http://www.jb51.net/article/57678.htm

你可能感兴趣的:(python)