Python sorted函数

来源:互联网 发布:laravel 获得sql语句 编辑:程序博客网 时间:2024/05/22 10:54
sorted(...)    sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

A. iterable
即迭代器,为可迭代类型,返回值是一个对iterable中元素进行排序后的列表(list)。iterable主要包括3类:
第一类是所有的序列类型,比如list(列表)、str(字符串)、tuple(元组)。
第二类是一些非序列类型,比如dict(字典)、file(文件)。
第三类是你定义的任何包含__iter__()或__getitem__()方法的类的对象。
C. key
可选参数。指定一个接收一个参数的函数,这个函数用于从每个List的每个元素中提取一个用于比较的关键字(属性或函数)。默认值为None。
D. reverse
可选参数。为一个布尔值,如果设置为True,列表元素将被倒序排列。
A. 基础排序

一个简单的升序排列很简单——只需要调用sorted()函数即可。 这个函数返回一个新的排序列表:

>>> sorted([5,2,3,1,4])[1, 2, 3, 4, 5]

>>> sorted({5: 'D', 3: 'B', 2: 'B', 1: 'E', 4: 'A'})[1, 2, 3, 4, 5]

是否可以给字典排序?字典是一种映射关系,没有顺序。当然了,如果要把(键, 值)的这种对进行排序,是没有问题的,前提是先把字典转化成可排序的结构,items()或者iteritems()可以做到这件事

b = a.items()print(b)  # [('Tuffy', 2), ('Spike', 10), ('Tom', 8), ('Tyke', 3), ('Jerry', 7)]from operator import itemgetterc = sorted(a.items(), key=itemgetter(1))print(c)  # [('Tuffy', 2), ('Tyke', 3), ('Jerry', 7), ('Tom', 8), ('Spike', 10)]d = sorted(a.iteritems(), key=itemgetter(1))print(d)  # [('Tuffy', 2), ('Tyke', 3), ('Jerry', 7), ('Tom', 8), ('Spike', 10)]e = sorted(a)print(e)  # 只对键排序,['Jerry', 'Spike', 'Tom', 'Tuffy', 'Tyke']

B. key使用
从Python2.4开始,list.sort()和sorted()方法都添加了一个key参数来说明一个函数,这个函数在做比较之前会对list中的每个元素进行调用。

>>> 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[2])   # sort by age[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
C. Operator模块中的函数
上面的key function模式很常见,因此Python提供了方便的函数使得祖先函数更简单和快捷。
operator module有itemgetter,attrgetter,以及从Python2.6开始的methodcaller函数。
使用 itemgetter和attrgetter可以加速排序,实现类似key function的功能,但减少代码的写作难度:
<pre class="python" name="code">>>> from operator import itemgetter, attrgetter  >>> sorted(student_tuples, key=itemgetter(2))

>>> [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]  >>> sorted(student_objects, key=attrgetter('age')) 

>>> [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
以上为按第三域排列。
operator模块支持多级排序。例如先按成绩排序,再按年龄排序:
>>> sorted(student_tuples, key=itemgetter(1,2)) >>> [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]  >>> sorted(student_objects, key=attrgetter('grade', 'age'))>>> [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

D. 升序与降序
list.sort()和sorted()都接收一个reverse参数。它是用于降序排序的标志。例如,为了获得学生年龄的降序排序:
>>> sorted(student_tuples, key=itemgetter(2), reverse=True)>>> [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]  >>> sorted(student_objects, key=attrgetter('age'), reverse=True)>>> [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

E. 排序稳定性和复杂的排序 从Python2.2开始,排序都保证是稳定的。意思是当多个记录有相同的关键字时,它们原始的排序保留。
>>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)] >>> sorted(data, key=itemgetter(0))>>> [('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]
注意到两个'blue'的记录保留了它们原始的顺序,因此('blue',1)保证在('blue',2)之前。 这个好的特性能让你建立复杂的排序。例如,将学生记录按成绩降序排序、按年两升序排列。先按年龄排序,再按成绩排序:
>>> s=sorted(student_object,key=attrgettter('age')) # sort on secondary key >>> sorted(s,key=attrgetter('grade'),reverse=True)>>> [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]


原创粉丝点击