python2.7 sorted cmp 排序函数

1. 不加参数

  >>>a = [3,2,1,4,5]

  >>>print sorted(a)

  >>>[1,2,3,4,5]

  >>>print a

  >>>[3,2,1,4,5]

分析:sorted 函数会返回一个排序好的序列,并不会更改原有序列,使用时注意记录排序结果。

默认的排序按从小到大的升序返回。

2.参数reverse

  >>>a = [3,2,1,4,5]

  >>>print sorted(a,reverse=True)

  >>>[5,4,3,2,1]

分析:reverse会改变默认的原有排序顺序。

3.参数cmp

  自定义判断函数。更灵活的指定两个对象的大小关系。例如按照学生的分数,从高到低对学生对象进行排序。

  首先写一个学生类,包括姓名,分数,年龄。

class Student:
  def __init__(self, name, grade, age):
    self.name = name
    self.grade = grade
    self.age = age
  def __repr__(self):
    return "%s %d %d" % (self.name, self.grade, self.age)

def my_cmp(self, other):
    return self.grade - other.grade

student_objects = [
    Student('john', 92, 15),
    Student('jane', 94, 12),
    Student('dave', 94, 10)
    ]

print sorted(student_objects,cmp=my_cmp)
>>>  [john 92 15, jane 94 12, dave 94 10]

  比较函数一般规定大于的判定,sorted函数返回升序,我们需要从高到低,则增加reverse关键字

print sorted(student_objects,cmp=my_cmp,reverse=True)

>>>[jane 94 12, dave 94 10, john 92 15]

4.复杂cmp

  在一些场合,简单的比较判断无法满足需求,判断大小不是直观地判断简单数据。

  例如:对学生排序,按分数高低排序,分数高的排在前面,若遇到相同分数则按年龄排序,年龄小的排在前面。

  分析:写cmp函数,确定大于的判断,分数高的大于分数低的,若分数相同,则年龄小的大于年龄大的

def my_cmp2(self,other):
    if self.grade > other.grade:
      return 1
    elif self.grade == other.grade:
      if self.age < other.age:
        return 1
      else:
        return -1
    else:
      return -1

print sorted(student_objects,cmp=my_cmp2,reverse=True)

>>>[dave 94 10, jane 94 12, john 92 15]

==========

2020年05月12日14:59:54 qsy

posted @ 2020-05-12 15:00  熊猫滚滚  阅读(2040)  评论(0编辑  收藏  举报