Python3.x运用cmp()函数进行高级排序报错

Python016

Python3.x运用cmp()函数进行高级排序报错,第1张

numbers.sort这种用法是错误的,如果你想要排序,则用如下语句:

num_sort=sorted(numbers,key=None,reverse=False)

新的list num_sort才是一个排序后的列表。然后,你自定义的cmp过程只能对比两个数字,而能对比列表中的各个元素,python3解释器不知道你要做什么,所以才会出错。

学习 Python 时,遇到看到菜鸟教程里的 cmp() 方法,衍生出这篇文章。但是后来和朋友讨论,感觉在实际应用中极少有用到比较字典大小的场景。不过能搞懂一个知识点,还是很开心的。

cmp(dict1, dict2) 比较两个字典大小的方法:先比字典长度,若相等就比 key 值,若再相等就比 value。

但是这个方法已经被 Python 3 取消了。

请参考: Python2 用 cmp() 比较字典大小 , Python3 为什么取消了 __cmp__ 方法

operator 模块提供了一系列方法比较两个字典大小,详细方法及使用示例请参考: Python3 使用 operator 模块比较字典大小 。

但是在写法上我们要注意,最好用 String 内置的方法,这样利于对空值的判断:

结果如下:

Python3自带了解决方案,在functools包中有一个把按cmp方式的写的函数转换成key方式函数的函数,用法如下

from functools import cmp_to_key

print(sorted(['bob','Bob','about','Zoo','Credit'], key=cmp_to_key(cmp_ignore_case)))

对你这个排序需求实际上用key方式完全可以达到求。

比如要先按每个单词的第2个字母排序再按第3个字母排序。

>>> from operator import itemgetter

>>> sorted(['bob','Bob','about','Zoo','Credit'], key=itemgetter(1,2))

['about', 'bob', 'Bob', 'Zoo', 'Credit']