为了账号安全,请及时绑定邮箱和手机立即绑定

如果list不仅仅包含 Student 类,则 __cmp__ 可能会报错,如何解决?

class Student(object):
   def __init__(self, name, score):
       self.name = name
       self.score = score
   def __str__(self):
       return '(%s: %s)' % (self.name, self.score)
   __repr__ = __str__

   def __cmp__(self, s):
       if self.name < s.name:
           return -1
       elif self.name > s.name:
           return 1
       else:
           return 0

>>> L = [Student('Tim', 99), Student('Bob', 88), Student('Alice', 77)]
>>> print sorted(L)
[(Alice: 77), (Bob: 88), (Tim: 99)]


注意: 如果list不仅仅包含 Student 类,则 __cmp__ 可能会报错:

L = [Student('Tim', 99), Student('Bob', 88), 100, 'Hello']
print sorted(L)

请思考如何解决?


正在回答

2 回答

从例子中可以看出 他们是按名字进行排序的 而名字 是__str__特殊方法定义的 

思路是 将不是Student类的元素 也转换成 str 类型 这样就可以与 Student类的名字进行比较了

def __cmp__(self,s):
    if not isinstance(s,Student):
         return cmp(self.name,str(s))
    else:
        return cmp(self.name,s.name)
        
cmp()函数接收两个参数
cmp(x,y) #可以比较x,y的大小, 
如果 x>y 会返回 1
如果 x<y 会返回 -1
如果 x == y 会返回 0
和sorted()这个高阶函数连用会减少很多代码
例如:
sorted([list],lambda x,y:cmp(x,y))
如果想要大的在前面,可以在 cmp() 前加负号 :-cmp(),这样在返回数值时会乘以-1,达到改变排序的目的


10 回复 有任何疑惑可以回复我~
#1

qq_1_95 提问者

非常感谢!
2016-12-13 回复 有任何疑惑可以回复我~
#2

慕粉2014408783

加油加油( •̀∀•́ )
2016-12-13 回复 有任何疑惑可以回复我~
#3

曾老爷子

非常感谢
2017-06-24 回复 有任何疑惑可以回复我~

class Student(object):
   def __init__(self, name, score):
       self.name = name
       self.score = score

   def __str__(self):
       return '(%s: %s)' % (self.name, self.score)
   __repr__ = __str__

   def __cmp__(self, s):
       if isinstance(s,Student):
           return cmp(self.name,s.name)
       else:
           return cmp(self.name,str(s))
#         transfer s into the form of str

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

如果list不仅仅包含 Student 类,则 __cmp__ 可能会报错,如何解决?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信