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.
Donc, pour le cas général, la façon de faire consiste à :
- "décorer" la liste: tu construit une liste de tuples contenant d'abord la valeur sur laquelle tu veux trier, puis l'objet d'origine.
- trier la liste "décorée"; Python triant les tuples en fonction de leurs éléments (de gauche à droite), tu obtiens une liste triée comme tu veux, avec les valeurs pour le tri en trop.
- virer les "décorations" de la liste pour retrouver des objets d'origine, dans l'ordre que tu veux.
Sur ton exemple:
liste_a_trier = [(p.x, p) for p in liste]
liste_a_trier.sort()
liste = [p for _, p in liste_a_trier]
Et voilà !
Je ne vous cache pas que dans le cas concret que j'ai en tête, c'est
plus imbriqué; plutôt genre
-----------------------------------------
class Point(object):
def __init__(self,x,y):
self.x = x
self.y = y
class ligne(object):
def __init__(self,P,Q):
self.depart = P
self.arrive = Q
---------------------------------------------------------
Ensuite, j'ai une liste de lignes que je voudrais classer par
ordonnées du point de départ, cà d si L est une ligne, je voudrais
classer en fonction de
L.depart.x
Je suppose que si j'ai une solution au premier problème, je pourrai en
déduire une au second problème, ainsi que des cas plus compliqués.
Tu supposes bien! Je te laisse faire; ça ne devrait pas te poser beaucoup de problème...
HTH
--
python -c "print ''.join([chr(154 - ord(c)) for c in 'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"