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来实现。
python中sort()方法的cmp参数的更多相关文章
- Python中sort、sorted的cmp参数废弃之后使用cmp_to_key实现类似功能
Python2.1以前的排序比较方法只提供一个cmp比较函数参数,没有__lt__等6个富比较方法, Python 2.1引入了富比较方法,Python3.4之后作废了cmp参数.相应地从Python ...
- 为什么Python中sort方法和sorted函数调用废弃使用cmp参数
Python中sort方法和sorted函数老猿在前面一些章节介绍过,具体语法及含义在此不再展开说明,但老猿在前面学习相关内容时,只使用了简单的案例,对这两个方法的key参数没有深入研究,总以为就是以 ...
- Python中sorted()方法
Python中sorted()方法的用法 1.先说一下iterable,中文意思是迭代器. Python的帮助文档中对iterable的解释是:iteralbe指的是能够一次返回它的一个成员的对象.i ...
- Python中sorted()方法的用法
Python中sorted()方法的用法 2012-12-24 22:01:14| 分类: Python |字号 订阅 1.先说一下iterable,中文意思是迭代器. Python的帮助文档中对i ...
- Python 列表 sort() 方法
描述 Python 列表 sort() 方法对列表进行排序. 语法 sort() 方法语法: L.sort([key=None][,reverse=False]) 参数 key-- 可选参数, 如果指 ...
- Python中sort和sorted函数代码解析
Python中sort和sorted函数代码解析 本文研究的主要是Python中sort和sorted函数的相关内容,具体如下. 一.sort函数 sort函数是序列的内部函数 函数原型: L.sor ...
- java中sort方法的自定义比较器写法(转载)
java中sort方法的自定义比较器写法 摘要 在做一些算法题时常常会需要对数组.自定义对象.集合进行排序. 在java中对数组排序提供了Arrays.sort()方法,对集合排序提供Collecti ...
- Python中__init__方法介绍
本文介绍Python中__init__方法的意义. __init__方法在类的一个对象被建立时,马上运行.这个方法可以用来对你的对象做一些你希望的 初始化 .注意,这个名称的开始和结尾 ...
- Python中strip方法的妙用
[开胃小菜] 当提到python中strip方法,想必凡接触过python的同行都知道它主要用来切除空格.有下面两种方法来实现. 方法一:用内置函数 #<python> if __name ...
随机推荐
- spring web中完成单元测试
对于在springweb总完单元测试,之前找过些资料,摸索了很久,记录下最终自己使用的方法 1,创建测试类,创建测试资源文件夹 src/test/resources/WEB_INFO/conf 将工程 ...
- 2015-03-06——ajax基础
IE6 必须使用Microsoft.XMLHTTP ActiveX组件来实例化一个对象 IE7已实现了XMLHttpRequest对象 var request = new ActiveXObject ...
- linux shell 入门
本文是本人学习linux shell入门收集整理,不完全原创. 参考博文: http://www.cnblogs.com/suyang/archive/2008/05/18/1201990.html ...
- SQL模糊查找
编辑器加载中... /*********************实现模糊查找**************************/ SELECT [UserId] ,[UserName] ,[User ...
- jQuery EasyUI - 数据表格(DataGrid)
由于工作需要,项目使用前端 jQuery EasyUI - DataGrid 来控制数据表格. 1.加载相关js和css,因为easyui依赖jquery,所有加载easyui前要先加载jquery, ...
- 【转】python面向对象中的元类
type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello.py模块: class Hel ...
- MSDN使用
比如我想查一下fopen这个函数怎么用,在索引里搜索一下fopen,很容易找到了. 但是如果我想横向扩展一下,查看一些与fopen相关的函数,应该怎么找呢? 很简单,点击定位: 你就能把fopen定位 ...
- sublime text3自动同步左边栏颜色背景为编辑栏颜色
下面的步骤需要安装Package Control插件,如果你已经安装,可跳过本步骤,直接看第二步. 第一步:安装Package Control插件: 按Ctrl+`调出console(注:安装有QQ输 ...
- php数组函数-array_pop()
array_pop()函数删除数组中的最后一个元素(出栈). array_pop(array) array:必需.规定数组 返回值:返回数组的最后一个值.如果数组是空,或者不是一个数组,将返回NULL ...
- INSPIRED启示录 读书笔记 - 第29章 大公司如何创新
大公司实现创新的方法 20%法则:谷歌的程序员有20%的工作时间可以用来从事创新研究,这个方法最早是从施乐帕克研究所学来的.20%法则鼓励普通员工自己尝试各种想法,让员工打心底愿意倾注更多的激情和汗水 ...