一、cmp函数基本概念
在Python 2.x版本中,cmp为内置函数,可以比较两个对象的大小关系,用于排序和比较操作中。cmp(a, b)会返回一个整数:
- 如果a
- 如果a==b,返回0
- 如果a>b,返回正整数
在Python 3.x版本中,cmp已经被删除
def cmp(a, b): return (a > b) - (a < b)
二、cmp函数的基本用法
使用cmp函数需要注意几点:
- cmp函数只能比较数字和字符串类型
- 在Python2.x版本中,cmp函数的返回值可以直接用于sorted或sort函数的比较操作中,但在Python3.x中,需要使用key参数
- 在Python3.x中,强制转换为比较函数也可以解决问题
下面是使用cmp比较数字和字符串的例子:
#比较数字类型(Python2.x和Python3.x) print(cmp(10, 5)) print(cmp(5, 10)) print(cmp(5, 5)) #比较字符串类型(Python2.x和Python3.x) print(cmp("a", "b")) print(cmp("b", "a")) print(cmp("a", "a"))
三、使用cmp进行高级排序
使用cmp进行高级排序,需要给定key参数以及cmp函数。下面是一个使用cmp进行高级排序的例子:
students = [("Tom", 19), ("Jack", 18), ("Lily", 20), ("Lucy", 22)] #按照年龄从小到大排序 students.sort(cmp=lambda x, y: cmp(x[1], y[1])) print(students) #按照年龄从大到小排序 students.sort(cmp=lambda x, y: cmp(y[1], x[1])) print(students)
四、使用cmp进行自定义对象排序
通过自定义对象的cmp函数,可以使用cmp进行自定义对象排序。下面是一个使用cmp进行自定义对象排序的例子:
class Person(object): def __init__(self, name, age): self.name = name self.age = age def __str__(self): return "{},{}".format(self.name,self.age) def __cmp__(self, other): if self.age < other.age: return -1 elif self.age > other.age: return 1 else: return 0 persons = [Person("Tom", 19), Person("Jack", 18), Person("Lily", 20), Person("Lucy", 22)] #按照年龄从小到大排序 persons.sort() for p in persons: print(p) #按照年龄从大到小排序 persons.sort(reverse=True) for p in persons: print(p)
五、小结
cmp函数可以进行数字和字符串的比较,并且可以用于高级排序和自定义对象排序中。但是,注意cmp在Python3.x版本中已经被删除,需要使用key参数或者比较函数替代。