如何在Python中像排序整数一样对类对象列表进行排序
按类对象的score属性排序列表的方法
方法一:用key参数快速排序(不用改类)
这是最灵活的方式,不需要修改类的代码,直接在排序时指定用score作为排序依据:
class MyClass: def __init__(self, score): self.score = score # 创建示例对象 x = MyClass(2) y = MyClass(3) z = MyClass(1) obj_list = [x, y, z] # 按score升序排序(直接修改原列表) obj_list.sort(key=lambda item: item.score) # 要是不想改原列表,用sorted()生成新列表 # sorted_list = sorted(obj_list, key=lambda item: item.score) # 查看结果 for obj in obj_list: print(obj.score) # 输出 1、2、3,对应z、x、y的顺序
方法二:给类加比较方法,支持直接sort()
如果你希望像排序整数那样直接调用list.sort(),可以给类定义__lt__方法,告诉Python怎么比较两个对象:
class MyClass: def __init__(self, score): self.score = score # 定义“小于”的规则:按score比较 def __lt__(self, other): return self.score < other.score # 创建示例对象 x = MyClass(2) y = MyClass(3) z = MyClass(1) obj_list = [x, y, z] # 直接调用sort(),自动按score升序排 obj_list.sort() # 查看结果 for obj in obj_list: print(obj.score) # 输出 1、2、3,对应z、x、y的顺序
降序排序的调整
要是需要按score从高到低排,两种方法都能改:
- 方法一:加
reverse=True参数,或者把key改成lambda item: -item.scoreobj_list.sort(key=lambda item: item.score, reverse=True) - 方法二:要么修改
__lt__里的判断为self.score > other.score,要么调用sort()时加reverse=True
内容的提问来源于stack exchange,提问作者someone
相关产品推荐
相关产品推荐

