2010-10-24 9 views
40

J'ai une liste des instances de classe -Trier une liste des instances de la classe Python

x = [<iteminstance1>,...] 

entre autres attributs de l'attribut classe a score. Comment puis-je trier les éléments dans l'ordre croissant en fonction de ce paramètre?

EDIT: Le list en python a quelque chose appelé sort. Puis-je l'utiliser ici? Comment puis-je diriger cette fonction pour utiliser mon attribut score?

Répondre

64
import operator 
sorted_x = sorted(x, key=operator.attrgetter('score')) 

si vous voulez trier x en place, vous pouvez aussi:

x.sort(key=operator.attrgetter('score')) 
+1

wow! est-ce si simple !! Juste vérifié. C'est :) –

+7

Bienvenue sur Python! Par souci d'exhaustivité: le paramètre "clé" des fonctions/méthodes srot accepte une fonction comme paramètre. Le module opérateur fournit des fonctions utiles aux tâches qui sont habituellement effectuées par le langage Syntax lui-même - comme une fonction "add" pour faire la même chose que le jeton "+" dans la langue, et dans ce cas l'attracteur fait de même " . "connecteur fait dans la syntaxe. D'autres paramètres à "clé" peuvent être des fonctions in situ définies avec "lambda". Dans ce cas, sorted_x = trié (x, lambda x: x.score)) - aurait aussi bien fonctionné. L'exemple donné est meilleur, cependant. – jsbueno

+1

Je ne suis pas sûr d'utiliser 'attrgetter', c'est mieux. Lambdas semble être tout aussi rapide, et semble plus propre IMO. – adw

88

En plus de la solution que vous avez accepté, vous pouvez aussi mettre en œuvre la __lt__() spéciale (« moins ») méthode sur la classe. La méthode sort() (et la fonction sorted()) pourront ensuite comparer les objets et ainsi les trier. Cela fonctionne mieux lorsque vous ne les trierez jamais que sur cet attribut.

class Foo(object): 

    def __init__(self, score): 
     self.score = score 

    def __lt__(self, other): 
     return self.score < other.score 

l = [Foo(3), Foo(1), Foo(2)] 
l.sort() 
+1

Ceci est particulièrement utile si vous n'avez pas accès à la fonction triée. Cela se produit lorsque trié est appelé par d'autres modules tels que les modules de bibliothèque standard. Exemple - 'priorityqueue' dans les appels' queue' triés pour les éléments que vous fournissez. –

+1

Que faire si nous avons des instances avec 2 params comme Foo ['abc', 3] –

+1

@BimleshSharma Ensuite, écrivez votre méthode '__lt__' en fonction de la façon dont vous voulez comparer vos instances, par exemple. 'return (self.text, self.num) <(autre.text, autre.num)'. – kindall