Eric Brunel a écrit :
On Fri, 27 Jun 2008 23:32:07 +0200, Laurent Claessens <moky.math@gmail.com> wrote:
Bonjour
J'ai une liste d'instances d'une classe que j'ai créé. Typiquement,
-----------------------------------------
class Point(object):
def __init__(self,x,y):
self.x = x
self.y = y
P = Point(1,3)
Q = Point(2,7)
liste = []
liste.append(P)
liste.append(Q)
---------------------------------------------------------
Je voudrais maintenant classer la liste par ordre de l'attribut x des
objets. Je vois comment je ferais ça de façon très piétonne et très
peu optimisée, mais est-ce qu'il y a moyen de faire vite, et propre ?
Et c'est un travail pour... decorate-sort-undecorate!
Les solutions à base de __cmp__ déjà données fonctionnent, mais ne sont quelquefois pas applicables: imagine qu'à un endroit de ton appli, tu aies besoin de trier par coordonnées x, et à un autre endroit par coordonnées y... Vu que tu ne peux pas avoir deux méthodes __cmp__, tu es battu.
Mais non...
Donc, pour le cas général, la façon de faire consiste à :
(snip explication du DSU)
liste_a_trier = [(p.x, p) for p in liste]
liste_a_trier.sort()
liste = [p for _, p in liste_a_trier]
Ou beaucoup plus simplement:
import operator
liste.sort(key=operator.attrgetter('x'))