【问题标题】:sorting a list with objects of a class as its items以类的对象作为其项目对列表进行排序
【发布时间】:2013-06-06 23:31:07
【问题描述】:

我有一个 python 列表,其项目是具有各种属性的类的对象,例如生日分数、周年纪念分数、婴儿分数.....我想根据这些属性之一对列表进行排序,比如周年纪念分数。我该怎么做?

【问题讨论】:

    标签: python list class sorting


    【解决方案1】:
    your_list.sort(key = lambda x : x.anniversary_score)
    

    或者如果属性名称是一个字符串,那么你可以使用:

    import operator
    your_list.sort(key=operator.attrgetter('anniversary_score'))
    

    【讨论】:

    • your_list.sort(key=operator.attrgetter('anniversary_score'))
    【解决方案2】:

    attrgetter 如果您事先不知道属性的名称(例如,它可能来自文件或函数参数),则很方便

    from operator import attrgetter
    
    sorted(my_list, key=attrgetter('anniversary_score'))
    

    【讨论】:

      【解决方案3】:

      使用sorted

      class X():
           def __init__(self, a_s):
                self.anniversary_score = a_s
      
      li = [X(1), X(2), X(3), X(4)]
      sorted(li, key=lambda x: x.anniversary_score)
      

      一般来说,Python Sorting Wiki 几乎包含您需要了解的有关 Python 排序的所有信息。

      【讨论】:

      • 你真的应该使用attrgetter,如你链接的wiki页面所示。​​
      【解决方案4】:

      一种方法是在您的类中定义__lt__()__eq__()方法,这将告诉Python 在您的类的一个实例与另一个实例相比时应该如何排序:

      class A():
          def __init__(self):
              self.sortattr = 'anniversary_score' # you can use 'baby_score', 'birthday_score' instead
          def __lt__(self, other):
              return getattr(self, self.sortattr) < getattr(other, other.sortattr)
          def __eq__(self, other):
              return getattr(self, self.sortattr) == getattr(other, other.sortattr)
      

      然后,只需使用sort(),就像对数字、字符串等列表一样:

       mylist.sort() # to sort in-place
      
       sorted(mylist)  # to return a new sorted list
      

      【讨论】:

      • cmp 已死,改用key
      • @jamylak 我已经更新了答案!感谢您的反馈,我读到对于 Python 3.0,应该使用 __lt__()__eq__(),因为不再支持 __cmd__()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      相关资源
      最近更新 更多