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

Python3 中怎么解决按score倒序,name正序

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.score == s.score:            
            return cmp(self.name, s.name)        
        return -cmp(self.score, s.score)
    L = [Student('Tim', 99), Student('Bob', 88), Student('Alice', 99)]
    print(sorted(L,key=lambda student:(student.score,student.name)))

https://img1.sycdn.imooc.com//5af2cb020001b7a703020035.jpg

python3 输出不是倒序,用reverse = True 直接倒过来了,怎么在按name排序

正在回答

7 回答

我找到了一个方法,可以在p3里解决你的问题。

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__
      
class Reverse(object):
    def __init__(self, obj):
        self.obj = obj
    def __lt__(self, other):
        return other.obj < self.obj
        
L = [Student('Tim', 99), Student('Bob', 88), Student('Alice', 99)]
print(sorted(L, key=lambda student: (student.score, Reverse(student.name))))

如果你有更好的方法,欢迎告之~~

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

qq_翔若冰素_0 提问者

非常感谢!
2018-05-15 回复 有任何疑惑可以回复我~

print(sorted(L,

             key=lambda student:(-student.score,student.name)))

这个最简单~ 不需要 __cmp__

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

上面的最佳有点麻烦了, 稍微改一下就可以了

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.score < s.score:            return -1        elif self.score > s.score:            return 1        else:            if self.name > s.name:                return -1            else:                return 1L = [Student('Tim', 99), Student('Bob', 88), Student('Alice', 99)]print sorted(L, reverse=True)


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

也可以使用笨一点儿的方法!直接采用if-else结构判断实现

0 回复 有任何疑惑可以回复我~
# 在lambda函数里,-x.score代表分数降序,x.name代表名字升序

print(sorted(L, key = lambda x :(-x.score, x.name)))


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

1小马哥1

这里的key是什么意思
2018-09-26 回复 有任何疑惑可以回复我~

cmp()前加-是什么意思

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

hb968790

cmp()是从小到大排序,-cmp()就是从大到小排序
2018-06-13 回复 有任何疑惑可以回复我~

最后一行:

print(sorted(L))
[(Alice: 99), (Tim: 99), (Bob: 88)]

如果想要这种:

[(Bob: 88), (Tim: 99), (Alice: 99)]
if self.score == s.score:
    return -cmp(self.name, s.name)
return cmp(self.score, s.score)


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

qq_翔若冰素_0 提问者

直接print(sorted(L)) 会报错的 而且python3中不支持cmp()了
2018-05-10 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

Python3 中怎么解决按score倒序,name正序

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