2017-07-16 1 views
-1

Ich erstellte die Klasse namens Student() mit den Attributen Name und Vorname. In dieser Klasse habe ich eine Klassenvariable erstellt -> all_students = []Wie sortiere ich die Liste der Objekte nach dem len des Attributs dieser Objekte? - Python

Beim Erstellen eines Objekts wird es dieser Klassenvariablen = all_students hinzugefügt.

Wie sortiere ich diese Liste von Objekten nach der Länge des Attributnamens von der längsten zur kürzesten?

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) 

Ich versuchte mit Operator, aber ich kann das nicht auf diese Weise tun. Wir werden dankbar sein für Hilfe.

Antwort

4

Sie sind fast da. Sie müssen nur Ihre Schlüssel eine Änderung ein lambda verwenden:.

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

Diese Studenten Liste sortieren in absteigender Reihenfolge werden von Namenslänge (man beachte die -len(...)

Wenn Sie attrgetter verwenden wollte, Sie würden Ihren Schlüssel zu key=lambda x: -len(operator.attrgetter('name')(x)) ändern müssen. Aber an diesem Punkt wird es einfacher, nur x.name zu verwenden.


Hier ist eine Demonstration. ich habe so eine __repr__ Methode hinzugefügt es wird klarer.

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

Sie können es nicht mit attrgetter tun. Verwenden Sie ein Lambda:

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

OP möchte, dass es in umgekehrter Reihenfolge sortiert wird, also würden Sie '-len (s.name)' benötigen. –

+1

... oder 'reverse = True'. – SethMMorton

0

Ich habe nicht genug Ruf noch kommentieren:

COLDSPEED Lösung ist gut, aber mehr pythonic noch eine Schlüsselfunktion (nicht Lambda) zu verwenden, und verwenden Sie die umgekehrte arg

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


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