python中sort()方法的cmp参数

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

  “如果希望元素能按照特定的方式进行排序(而不是sort函数默认的方式,即根据python的默认排序规则按升序排列元素,第5章内对此进行讲解),那么可以通过compare(x,y)的形式自定义比较函数。compare(x,y)函数会在x<y时返回负数,在x>y时返回正数,如果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 "<pyshell#91>", line 1, in <module> numbers.sort(cmp=1) TypeError: 'int' object is not callable >>>

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

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

def mycmp1(x,y): #升序排列 return x-y def mycmp2(x,y): #降序排列 return y-x

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

#升序排列 numbers = [5,2,9,7] def mycmp1(x,y): return x-y numbers.sort(cmp = mycmp1) print numbers >>> [2, 5, 7, 9] #降序排列 numbers = [5,2,9,7] def mycmp2(x,y): return y-x numbers.sort(cmp = mycmp2) print numbers >>> [9,7,5,2]

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

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

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

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

 


__EOF__

本文作者cnhkzyy
本文链接https://www.cnblogs.com/my_captain/p/8678996.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   cnhkzyy  阅读(22584)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示