1. 不加参数
>>>a = [3,2,1,4,5]
>>>print sorted(a)
>>>[1,2,3,4,5]
>>>print a
>>>[3,2,1,4,5]
分析:sorted 函数会返回一个排序好的新序列,并不会更改原有序列,使用时注意记录排序结果。
默认的排序按从小到大的升序返回。
2.参数reverse
>>>a = [3,2,1,4,5]
>>>print sorted(a,reverse=True)
>>>[5,4,3,2,1]
分析:reverse会改变默认的原有排序顺序。
3.参数cmp
自定义判断函数。更灵活的指定两个对象的大小关系。例如按照学生的分数,从高到低对学生对象进行排序。
首先写一个学生类,包括姓名,分数,年龄。
class Student:
def __init__(self, name, grade, age):
self.name = name
self.grade = grade
self.age = age
def __repr__(self):
return "%s %d %d" % (self.name, self.grade, self.age)
def my_cmp(self, other):
return self.grade - other.grade
student_objects = [
Student('john', 92, 15),
Student('jane', 94, 12),
Student('dave', 94, 10)
]
print sorted(student_objects,cmp=my_cmp)
>>> [john 92 15, jane 94 12, dave 94 10]
比较函数一般规定大于的判定,sorted函数返回升序,我们需要从高到低,则增加reverse关键字
print sorted(student_objects,cmp=my_cmp,reverse=True)
>>>[jane 94 12, dave 94 10, john 92 15]
4.复杂cmp
在一些场合,简单的比较判断无法满足需求,判断大小不是直观地判断简单数据。
例如:对学生排序,按分数高低排序,分数高的排在前面,若遇到相同分数则按年龄排序,年龄小的排在前面。
分析:写cmp函数,确定大于的判断,分数高的大于分数低的,若分数相同,则年龄小的大于年龄大的。
def my_cmp2(self,other):
if self.grade > other.grade:
return 1
elif self.grade == other.grade:
if self.age < other.age:
return 1
else:
return -1
else:
return -1
print sorted(student_objects,cmp=my_cmp2,reverse=True)
>>>[dave 94 10, jane 94 12, john 92 15]
==========
2020年05月12日14:59:54 qsy