注:参考官方文档,对How to系列的总结,方便自己以后回顾,建议读者看官方文档,讲的很容易理解。
Sorting Basics
基本的排序有两种: sorted(list) 、list.sort( ),默认是升序
>>> sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]
>>> a = [5, 2, 3, 1, 4]
>>> a.sort()
>>> a[1, 2, 3, 4, 5]
区别1:list.sort()会改变原有list , sorted()会返回一个新的list,原有list不变。
区别2:list.sort()只能用于list,而sorted()可用于任何可迭代的对象。
官方解释:Python lists have a built-in list.sort() method that modifies the list in-place. There is also a sorted() built-in function that builds a new sorted list from an iterable.
为了方便记忆,可以把list.sort()记为是list的一个函数,调用改变自身;而sorted是一个类似外部排序函数的性质。(仅仅方便记忆,这样描述不准确)
Key Functions
从python 2.4开始,可以为list.sort() and sorted()加上一个key参数作为排序的规则。
下面是一个例子,将字符串中的单词按照小写字母顺序排序。
>>> sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
** key 参数的值必须是只需一个变量并且返回一个值(这个值就是排序的规则)的函数 **
根据索引排序:
>>> 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)]
根据对象属性排序:
>>> class Student:
def __init__(self, name, grade, age):
self.name = name
self.grade = grade
self.age = age
def __repr__(self):
return repr((self.name, self.grade, self.age))
>>> student_objects = [ Student('john', 'A', 15), Student('jane', 'B', 12),
Student('dave', 'B', 10),]
>>> sorted(student_objects, key=lambda student: student.age) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
Operator Module Functions
使用 operator.itemgetter(),operator.attrgetter()以及Python 2.5 之后的operator.methodcaller()
>>> 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.methodcaller()函数,使用方法固定的参数要求对每个对象进行排序。例如,str.count()方法可用于通过计数在消息的惊叹号的数目来计算消息优先级:
>>> messages = ['critical!!!', 'hurry!', 'standby', 'immediate!!']
>>> sorted(messages, key=methodcaller('count', '!'))
['standby', 'hurry!', 'immediate!!', 'critical!!!']
Ascending and Descending
list.sort()和sorted()可以通过一个boolean参数来进行升序/降序切换
>>> 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)]
从Python2.2开始,排序都保证是稳定的。意思是当多个记录有相同的关键字时,它们原始的排序保留:
>>> data = [('red', 2), ('blue', 1), ('red', 1), ('blue', 2)]
>>> sorted(data, key=itemgetter(0))
[('blue', 1), ('blue', 2), ('red', 2), ('red', 1)]
这个好的特性能让你建立复杂的排序。例如,将学生记录按成绩降序排序、按年两升序排列。先按年龄排序,再按成绩排序。
>>> s = sorted(student_objects, key=attrgetter('age')) # sort on secondary key
>>> sorted(s, key=attrgetter('grade'), reverse=True) # now sort on primary key, descending
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
网友评论