最近在做179题最大数时,遇到了cmp函数用于自定义排序的问题,对此加以整理。

注:list.sort()仅为list设计,而sorted()函数可接收任何的iterable。

1、首先解释python中sorted()函数中cmp、key、reverse参数



sorted



如上,sorted有3个参数,默认情况下返回从小到大排序的列表。

第一个参数是一个iterable,返回值是一个对iterable中元素进行排序后的列表(list)。

可选的参数有三个,cmp、key和reverse,各自作用如下:

  • 1)cmp指定一个定制的比较函数,这个函数接收两个参数(iterable的元素),如果第一个参数小于第二个参数,返回一个负数;如果第一个参数等于第二个参数,返回零;如果第一个参数大于第二个参数,返回一个正数。默认值为None。
  • 2)key指定一个接收一个参数的函数,这个函数用于从每个元素中提取一个用于比较的关键字。默认值为None。
  • 3)reverse是一个布尔值。如果设置为True,列表元素将被倒序排列。
  • 4)key参数的值应该是一个函数,这个函数接收一个参数并且返回一个用于比较的关键字。对复杂对象的比较通常是使用对象的切片作为关键字。例如:
students



由上可知:

  • 如果想实现自定义排序,可对cmp函数进行重写,如下:




stft实现python std函数python_stft实现python


自定义排序,重写cmp函数

2、python3中的sorted函数

python3废弃了python2 中sorted函数的cmp参数,python3中的sorted形式如下:


sorted(iterable,key=None,reverse=False)


  • key主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse是一个布尔值。如果设置为True,列表元素将被倒序排列,默认为False。

示例:


例1:
sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}) [1, 2, 3, 4, 5]

例2:
array = [{"age":20,"name":"a"},{"age":25,"name":"b"},{"age":10,"name":"c"}]
array = sorted(array,key=lambda x:x["age"])
[{'age': 10, 'name': 'c'}, {'age': 20, 'name': 'a'}, {'age': 25, 'name': 'b'}]

例3:
s = 'asdf234GDSdsf23' #排序:小写-大写-奇数-偶数
 
print("".join(sorted(s, key=lambda x: (x.isdigit(),x.isdigit() and int(x) % 2 == 0,x.isupper(),x))))
原理:先比较元组的第一个值,FALSE<TRUE,如果相等就比较元组的下一个值,以此类推。

先看一下Boolean value 的排序:
print(sorted([True,Flase]))===>结果[False,True]
Boolean 的排序会将 False 排在前,True排在后 .
1.x.isdigit()的作用是把数字放在后边,字母放在前边.
2.x.isdigit() and int(x) % 2 == 0的作用是保证奇数在前,偶数在后。
3.x.isupper()的作用是在前面基础上,保证字母小写在前大写在后.
4.最后的x表示在前面基础上,对所有类别数字或字母排序。
最后结果:addffssDGS33224

例4:
list1=[7, -8, 5, 4, 0, -2, -5]      #要求1.正数在前负数在后 2.整数从小到大 3.负数从大到小
sorted(list1,key=lambda x:(x<0,abs(x)))


要在python3中实现复杂的自定义排序,可借助cmp_to_key函数:


#题目:[3,30,34,5,9]  #输出 9534330