python中sort的参数_python中sort()方法的cmp参数

《python基础编程》里有讲到一段高级排序:

“如果希望元素能按照特定的方式进行排序(而不是sort函数默认的方式,即根据python的默认排序规则按升序排列元素,第5章内对此进行讲解),那么可以通过compare(x,y)的形式自定义比较函数。compare(x,y)函数会在xy时返回正数,如果x=y则返回0(根据你的定义)。定义好该函数之后,就可以提供给sort方法作为参数了。内建函数cmp提供了比较函数的默认实现方式:

>>>cmp(42,32)1

>>>cmp(99,100)-1

>>>cmp(10,10)

0>>>numbers = [5,2,9,7]>>>numbers.sort(cmp)>>>numbers

[2,5,7,9]

"

对于sort()方法,如果不传入参数,默认cmp为None,即numbers.sort()=number,sort(cmp)=number.sort(cmp=None),我们可以做一个验证:

>>> numbers = [5,2,9,7]

>>> numbers.sort()

>>> numbers

[2, 5, 7, 9]

>>> numbers = [5,2,9,7]

>>> numbers.sort(cmp)

>>> numbers

[2, 5, 7, 9]

>>> numbers = [5,2,9,7]

>>> numbers.sort(cmp=None)

>>> numbers

[2, 5, 7, 9]

>>>

如果传入参数,numbers.sort(cmp=1),我们可以验证一下,整型的参数可不可以:

>>> numbers = [5,2,9,7]>>> numbers.sort(cmp=1)

Traceback (most recent call last):

File"", line 1, in numbers.sort(cmp=1)

TypeError:'int' object is notcallable>>>

代码报错:int对象不是一个callable,可调用对象。callable(object) 方法用来检测对象是否可被调用,即是否是一个函数,如果是则调用该函数的值,赋值给cmp。

那么我们如何自定义一个比较函数呢?

def mycmp1(x,y): #升序排列

return x-ydef mycmp2(x,y): #降序排列

return y-x

其中的规律就是:两两比较,如果返回为正,则交换两者的位置,即y在前x在后,否则x在前y在后。也可以这样解释,升序就是拿第一个数比对后面的数,降序就是拿最后一个数比对前面的数。

#升序排列

numbers = [5,2,9,7]defmycmp1(x,y):return x-y

numbers.sort(cmp=mycmp1)printnumbers>>>[2, 5, 7, 9]#降序排列

numbers = [5,2,9,7]defmycmp2(x,y):return y-x

numbers.sort(cmp=mycmp2)printnumbers>>>[9,7,5,2]

当然,也可以写作numbers.sort(mycmp1),省略cmp。

我们还可以直接穿入匿名函数lambda:

#升序排列

numbers = [5,2,9,7]

numbers.sort(cmp= lambda x,y: x-y)printnumbers>>>[2,5,7,9]#降序排列

numbers = [5,2,9,7]

numbers.sort(cmp= lambda x,y: y-x)printnumbers>>>[9,7,5,2]

另外,python3.x中取消了cmp参数,也不支持直接往sort()里面传函数,但可以构造排序函数传递给key来实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值