如何通过这些对象的len属性对对象列表进行排序? - Python

时间:2017-07-16 19:58:45

标签: python python-3.x sorting

我使用属性name和surname创建了名为Student()的类。在那个班级我创建了类变量 - > all_students = []

创建对象时,它将被添加到该类变量= all_students。

如何按照从最长到最短的属性名称的长度对对象列表进行排序?

import operator
class Student:

    all_students = []
    def __init__(self, name, surname):
        self.name = name
        self.surname = surname
        Student.all_students.append(self)

s_1 = Student("Jacobbbb", "anything")

s_2 = Student("Mat", "anything1")

s_3 = Student("Marcooooooo", "sss")


new_list = sorted(Student.all_students, key=operator.attrgetter(len('name')))

for student in new_list:
    print(student.name)

我尝试过运营商,但我不能这样做。将不胜感激。

3 个答案:

答案 0 :(得分:4)

你几乎就在那里。您只需稍微更改密钥即可使用lambda

sorted(Student.all_students, key=lambda x: -len(x.name))

这将按名称长度的降序对学生列表进行排序(请注意-len(...)

如果您想使用attrgetter,则需要将密钥更改为key=lambda x: -len(operator.attrgetter('name')(x))。但在那时,使用x.name变得更加简单。

这是一个示范。我已经添加了__repr__方法,因此它变得更加清晰。

In [320]: def __repr__(self): return 'Student(%s %s)' %(self.name, self.surname)

In [321]: Student.__repr__ = __repr__

In [322]: sorted(Student.all_students, key=lambda x: -len(x.name))
Out[322]: [Student(Marcooooooo sss), Student(Jacobbbb anything), Student(Mat anything1)]

答案 1 :(得分:1)

您无法使用attrgetter执行此操作。使用lambda:

sorted(Student.all_students, key=lambda s: len(s.name))

答案 2 :(得分:0)

我还没有足够的声誉发表评论:

COLDSPEED的解决方案很好,但更多的pythonic仍然使用关键功能(而不是lambda),并使用反向arg

def name_length(student):
    return len(student.name)


sorted(Student.all_students, key=name_length, reverse=True)