共同点
都有三个参数,
cmp用户自定义(指定函数),每个元素都会调用,效率没key高
key带一个参数的函数,用来为每个元素提取比较值
reverse=True 翻转
sort
sort作用的对象一般是列表
sort直接排序后就改变了自己,不用生成新的对象,所以效率更高
>>> m=[1,2,3,4,5]
>>> m.sort(reverse=True
>>> m
[5, 4, 3, 2, 1]
>>> m
[‘This‘, ‘is‘, ‘a‘, ‘test‘, ‘string‘, ‘from‘, ‘Andrew‘]
>>> m.sort()
>>> m
[‘Andrew‘, ‘This‘, ‘a‘, ‘from‘, ‘is‘, ‘string‘, ‘test‘]
>>> m.sort(key=str.lower)
>>> m
[‘a‘, ‘Andrew‘, ‘from‘, ‘is‘, ‘string‘, ‘test‘, ‘This‘]
sorted
python的内置函数
能够接受一切可迭代的对象
排序后不会改变自身,会新建一个对象,因此效率较低,但功能强大
对字典的排序(只是key)
>>> sorted({1: ‘D‘, 2: ‘B‘, 3: ‘B‘, 4: ‘E‘, 5: ‘A‘})
[1, 2, 3, 4, 5]
>>> sorted("This is a test string from Andrew".split(), key=str.lower)
[‘a‘, ‘Andrew‘, ‘from‘, ‘is‘, ‘string‘, ‘test‘, ‘This‘] #和上面的sort也可以
key参数需要指定一个函数,这个函数一个需要一个参数,且返回一个可用来比较的权值
这个函数仅仅会调用一次,比cmp参数指定的函数效率要高
我们可以使用operator中itemgetter, attrgetter, methodcaller来快速定义key函数,
>>> from operator import itemgetter, attrgetter, methodcaller
>>> sorted(student_tuples, key=itemgetter(1,2)) #允许多级比较
[(‘john‘, ‘A‘, 15), (‘dave‘, ‘B‘, 10), (‘jane‘, ‘B‘, 12)] #和上面的sort也可以
>>> test #字典同样也可以多级比较,只不过是指定key
[{‘grade‘: ‘A‘, ‘score‘: 15, ‘name‘: ‘john‘}, {‘grade‘: ‘B‘, ‘score‘: 10, ‘name‘: ‘dave‘}, {‘grade‘: ‘B‘, ‘score‘: 12, ‘name‘: ‘jane‘}]
>>> sorted(test, key=itemgetter(‘score‘,‘grade‘) )
[{‘grade‘: ‘B‘, ‘score‘: 10, ‘name‘: ‘dave‘}, {‘grade‘: ‘B‘, ‘score‘: 12, ‘name‘: ‘jane‘}, {‘grade‘: ‘A‘, ‘score‘: 15, ‘name‘: ‘john‘}]
使用attrgetter,可以对 对象的属性进行排序等
sorted(student_objects, key=attrgetter(‘grade‘, ‘age‘))
[(‘john‘, ‘A‘, 15), (‘dave‘, ‘B‘, 10), (‘jane‘, ‘B‘, 12)]
对字典排序:
>>> test #按分数排再按等级排
{‘sun‘: [‘E‘, 3], ‘zhao‘: [‘A‘, 90], ‘wang‘: [‘A‘, 88], ‘li‘: [‘B‘, 75]}
>>> sorted(test.iteritems(), key=lambda x: (x[1][1],x[1][0]))
[(‘sun‘, [‘E‘, 3]), (‘li‘, [‘B‘, 75]), (‘wang‘, [‘A‘, 88]), (‘zhao‘, [‘A‘, 90])]