您的位置:

Python中cmp函数的用法

一、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参数或者比较函数替代。