我使用属性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)
我尝试过运营商,但我不能这样做。将不胜感激。
答案 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)