2017-07-16 1 views
-1

属性nameと姓のStudent()という名前のクラスを作成しました。そのクラスでは、クラス変数 - > all_students = []を作成しました。これらのオブジェクトの属性のlenによってオブジェクトのリストをソートする方法はありますか? - Python

オブジェクトを作成するときに、クラス変数= 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) 

私はオペレータで試しましたが、このようにはできません。助けに感謝します。

答えて

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

attrgetterで行うことはできません。ラムダを使用してください:

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

OPはそれを逆順にソートしたいので、 '-len(s.name)'が必要です。 –

+1

...または 'reverse = True'です。 – SethMMorton

0

私はまだ、コメントするのに十分な評判を持っていない:

COLDSPEEDのソリューションは良いですが、より多くのニシキヘビはまだキー機能(ないラムダ)を使用し、

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


sorted(Student.all_students, key=name_length, reverse=True) 
ARG逆を使用します
関連する問題