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

Python018

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

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

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

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

python3 sorted取消了对cmp的支持。 

python3 帮助文档: 

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

reverse是一个布尔值。如果设置为True,列表元素将被倒序排列,默认为False

key接受一个函数,这个函数只接受一个元素,默认为None

Key的作用原理

Python2中的自定义布尔函数cmp=custom_cmp(x, y)由Python3中的key=custom_key(x)代替。

在python3中,待比较元素x通过custom_key函数转化为Python能比较的值custom_key(x),进而再基于返回值进行排序。

例子1:

my_alphabet = ['a', 'b', 'c']def custom_key(word):

  numbers = []   for letter in word:

     numbers.append(my_alphabet.index(letter))   return numbers# python中的整数列表能够比较大小# custom_key('cbaba')==[2, 1, 0, 1, 0]x=['cbaba', 'ababa', 'bbaa']

x.sort(key=custom_key)123456789101112

例子2

students = [('john', 'A', 15), ('jane', 'B', 12), ('dave','B', 10)]

sorted(students,key=lambda x: x[2]) #按照年龄来排序12

关于lambda表达式

例子3

默认sorted([True, False])==[False, True] (False=0 <True=1)

一个字符串排序,排序规则:小写<大写<奇数<偶数

#元组内(e1, e2, e3)的优先级排列为: e1 >e2 >e3sorted(s, key=lambda x: (x.isdigit(),x.isdigit() and int(x) % 2 == 0,x.isupper(),x)#input: 'asdf234GDSdsf23'#output: 'addffssDGS33224'12345

x.isdigit()的作用是把数字放在后边(True),字母放在前面(False).

x.isdigit() and int(x) % 2 == 0的作用是保证数字中奇数在前(False),偶数在后(True)。

x.isupper()的作用是在前面基础上,保证字母小写(False)在前大写在后(True).

最后的x表示在前面基础上,对所有类别数字或字母排序。

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

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

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

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

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

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

结果如下: