2012-04-07 10 views
12

Chciałbym iteracyjne nad słownika obiektów w atribute klasyfikowane sposóbJak sortować słowniki obiektów według wartości atrybutów w pythonie?

import operator 

class Student: 
     def __init__(self, name, grade, age): 
       self.name = name 
       self.grade = grade 
       self.age = age 


studi1=Student('john', 'A', 15) 
studi2=Student('dave', 'B', 10) 
studi3=Student('jane', 'B', 12) 

student_Dict = {} 
student_Dict[studi1.name]=studi1 
student_Dict[studi2.name]=studi2 
student_Dict[studi3.name]=studi3 

for key in (sorted(student_Dict, key=operator.attrgetter('age'))): 
    print(key) 

To daje mi komunikat eror: „AttributeError:«str»obiekt ma bez atrybutu«wiek»”

+0

Dziękuję, komentarze Karla Knechtela są prawdziwe. Nie wymyśliłem tej kwestii. Więc obie odpowiedzi (Nolen Royalty i Dugres) są poprawne. – Fienchen21

+0

To zaoszczędziłem mnóstwo czasu – Sakeer

Odpowiedz

9
for student in (sorted(student_Dict.values(), key=operator.attrgetter('age'))): 
    print(student.name) 
+1

Powtarza to wartości, posortowane według atrybutu. To może, ale nie musi być to, czego chcesz; nie jest to całkiem jasne w PO. –

+0

@KarlKnechtel ma absolutnie rację, że w OP istnieje pewna niejednoznaczność. Uważam, że ta metoda powinna być szybsza niż moja, chociaż wydaje mi się, że sortowanie kluczy jest nieco bardziej jasne. –

-1

Jak jest wykazana w dokumentacji sorted metodą

sorted(student_Dict.keys(), key=lambda student: student.age) 
+2

Tęskniłeś za sednem. Iteracja nad dyktatem polega na iteracji kluczy. Próbujemy sortować klucze zgodnie z atrybutem odpowiedniej wartości. –

4
>>> for key in sorted(student_Dict, key = lambda name: student_Dict[name].age): 
...  print key 
... 
dave 
jane 
john 
+1

Powtarza to klucze, zgodnie z atrybutem odpowiedniej wartości. To może, ale nie musi być to, czego chcesz; nie jest to całkiem jasne w PO. –

+0

@Karl: Myślę, że właśnie tego szukają OP w oparciu o to, co napisali. – martineau

1
class Student: 
    def __init__(self, name, grade, age): 
      self.name = name 
      self.grade = grade 
      self.age = age 
    def __repr__(self): 
      return repr((self.name, self.grade, self.age)) 


student_objects = [ 
    Student('john', 'A', 15), 
    Student('jane', 'B', 12), 
    Student('dave', 'B', 10), 
] 
print student_objects 
student_objects.sort(key=attrgetter('age')) 
print student_objects 

źródło: https://wiki.python.org/moin/HowTo/Sorting