按这些对象的特定属性对对象列表进行排序?

Jey*_*Key 0 python sorting python-3.x

我创建了名为 Student() 的类,其属性为 name 和 surname。在那个类中,我创建了类变量 -> 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)
Run Code Online (Sandbox Code Playgroud)

我试过用运营商,但我不能这样做。将不胜感激的帮助。

cs9*_*s95 6

您快到了。您只需要稍微更改您的密钥即可使用lambda

sorted(Student.all_students, key=lambda x: -len(x.name))
Run Code Online (Sandbox Code Playgroud)

这将按姓名长度的降序对您的学生列表进行排序(注意-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)]
Run Code Online (Sandbox Code Playgroud)