python内置排序方式有两种,一种是针对列表的.sort()方法,另外一种是sorted()函数,他们方法类似,区别有两点
1、list.sort()方法只适合列表对象,sorted()函数适合任何可迭代对象。
2、list.sort()用于改变当前列表,sorted()返回一个新的序列。
用法示例:
>>>help(sorted) Help on built-in function sorted in module builtins: sorted(...) sorted(iterable, key=None, reverse=False) --> new sorted list >>>ls = [5,1,9,7] >>> sorted(ls) [1, 5, 7, 9] >>>ls.sort() >>>ls [1, 5, 7, 9] #逆序 >>ls.sort(reverse = True) >>>ls [9,7,5,1]
通过key函数指定排序方法:(因为sort()和sorted()功能类似,之后都使用sorted()示例)
#假定有个学生年级、年龄名单 >>>students = {'mhye':(2,18),'Jackey':(3,15),'Lucy':(1,16)} #如果想要按年级排序 >>>sorted(students.items(),key = lambda x:x[1][0]) [('Lucy', (1, 16)), ('mhye', (2, 18)), ('Jackey', (3, 15))] >>>sorted(students.items(),key = lambda x:x[1][0]) [('Jackey', (3, 15)), ('Lucy', (1, 16)), ('mhye', (2, 18))] #这个例子不算太好,不够直观,下面这个略微直观点 >>>students=[('mhye',2,18),('Jackey',3,15),('Lucy',1,16)] >>>sorted(students,key = lambda x : x[2]) [('Jackey', 3, 15), ('Lucy', 1, 16), ('mhye', 2, 18)]
通过对象的属性进行排序,实例化的类按照属性进行排序
>>>class student(): def __init__(self,name,grade,age): self.name = name self.age = age self.grade = grade def __repr__(self): return repr((self.name,self.grade,self.age)) def grade_age(self): return self.grade/self.age >>>data =(student('mhye',2,24),student('Jackey',1,17),student('Lucy',3,5)) >>>sorted(data,key =lambda student:student.grade) [('Jackey', 1, 17), ('mhye', 2, 24), ('Lucy', 3, 5)]
python内置的operater模块中,itemgetter,attrgetter,methodcaller方法可以用来对对象,属性,方法进行调用用于排序
>>>from operator import attrgetter,itemgetter,methodcaller >>>sorted(data,key = attrgetter('age')) [('Lucy', 3, 5), ('Jackey', 1, 17), ('mhye', 2, 24)] In [66]: sorted(data2,key = itemgetter(2)) Out[66]: [('Lucy', 3, 5), ('Jackey', 1, 17), ('mhye', 2, 24)] #itemgetter只支持可索引对象 >>>data2 = (('mhye', 2, 24), ('Jackey', 1, 17), ('Lucy', 3, 5)) >>>sorted(data2,key = itemgetter(2))#以年龄排序 [('Lucy', 3, 5), ('Jackey', 1, 17), ('mhye', 2, 24)] <<<sorted(data2,key = itemgetter(0,1))#以姓名、年级排序 [('Jackey', 1, 17), ('Lucy', 3, 5), ('mhye', 2, 24)] sorted(data,key = methodcaller('grade_age')) [('Jackey', 1, 17), ('mhye', 2, 24), ('Lucy', 3, 5)]