一:声明
python 3.0 中 取消了 cmp 函数
二:sort 和 sorted 的用法
(1) 基本用法
l = [2,1,3,5,4]
sort 函数改变列表l本身
sorted函数不改变原列表,返回一个新列表
l.sort() 默认升序
k = sorted(l) 默认升序
(2)加深一点
sorted(iterable,key,reverse)
sort(key,reverse)
下面以sorted 为例讲起
iterable 为 要排序的 对象(如:列表)
key参数来指定一个函数,此函数在每个元素比较前被调用。 默认会按照指定的key值进行排序,可为空
reverse 排序规则,reverse = True 降序, reverse = False 升序 可为空 默认升序
(1) 对于复杂的对象,使用对象的下标作为key。
nums = [[1,'chen'], [2,'hui'], [1,'hui'], [2,'chen']]
_nums2 = sorted(nums, key = lambda x: x[0],reverse = True)
print(_nums2)
(2) 若当有多级排序时,但多级排序的形式是一样的,若是升序都是升序,若是降序都是降序
可以引进 operator模块 中 itemgetter attrgetter 函数 :from operator import itemgetter, attrgette
operator.itemgetter() ----- 通过下标
operator.attrgetter() ----- 通过参数
operator.methodcaller() -----python 2.5 被引入,下文详细介绍
如代码:
from operator import itemgetter, attrgetter
nums = [[1,'chen'], [2,'hui'], [1,'hui'], [2,'chen']]
_nums1 = sorted(nums, key = itemgetter(0,1),reverse = True)
_nums2 = sorted(nums, key = lambda x: (x[0], x[1]),reverse = True)
print(_nums1)
print(_nums2)
结果:
结果时一样的
下面介绍operator.methodcaller() 函数:
这个函数是对某个对象的使用固定参数进行排序,例如:str.count() 函数可以计算每个字符串对象中含有某个参数的个数,那运用这个函数我就可以通过 str.count() 计算出某个字符的个数从而来确定排序的优先级:
>>> from operator import methodcaller
>>> messages = ['critical!!!', 'hurry!', 'standby', 'immediate!!']
>>> sorted(messages, key=methodcaller('count', '!'))
['standby', 'hurry!', 'immediate!!', 'critical!!!']
(3)多级参数且排序形式不一样
可以借助 functools模块中 cmp_to_key() 函数,模拟cmp函数
如按照 下表0的降序 和下表1的升序排序
""""如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。"""
代码:
import functools
nums = [[1,'chen'], [2,'hui'], [1,'hui'], [2,'chen']]
def tcmp(a, b):
if a[0] > b[0]:
return -1
elif a[0] == b[0]:
if a[1] < b[1]:
return -1
elif a[1] > b[1]:
return 1
else :
return 0
elif a < b:
return 1
_nums = sorted(nums, key=functools.cmp_to_key(tcmp))
print(_nums)
结果:
上述多级排序,在参数相同的情况下,好像都不改变相对位置