IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Trier une liste de "classes"


Sujet :

Python

  1. #1
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut Trier une liste de "classes"
    Bonjour,
    j'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #!/usr/bin/env python
    #coding=utf-8
    class Interval():
        def __init__(self, a, b):
            if a > b:
                self.min = b
                self.max = a
            else:
                self.min = a
                self.max = b
     
        def __str__(self):
            return '(' + str(self.min) + ';' + str(self.max) + ')'
     
    I = Interval(3, -4)
    J = Interval(-5, 7)
    K = Interval(-2, 9)
     
    intervalSorted =  [I, J, K] # ???
     
    for i in intervalSorted:
        print str(i)
    Je voudrais que les intervalles soient rangés suivant les valeurs croissantes des min. Autrement dit, je voudrais faire un tri suivant les valeurs de I.min, J.min et K.min.

    Toute info. est la bienvenue.

  2. #2
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Avant de me faire engueler par pacificator le violent , je mets la réponse adaptée de ce qui se trouve en fait ici : un autre post .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #!/usr/bin/env python
    #coding=utf-8
    class Interval():
        def __init__(self, a, b):
            if a > b:
                self.min = b
                self.max = a
            else:
                self.min = a
                self.max = b
     
        def __str__(self):
            return '(' + str(self.min) + ';' + str(self.max) + ')'
     
     
    def cmpval(x,y):
        if x.min<y.min:
            return -1
        elif x.min==y.min:
            return 0
        else:
            return 1
     
    I = Interval(3, -4)
    J = Interval(-5, 7)
    K = Interval(-2, 9)
     
    intervalSorted =  [I, J, K]
    intervalSorted.sort(cmpval)
     
    for i in intervalSorted:
        print str(i)

  3. #3
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Avant de me faire engueler par pacificator le violent
    Disons que la réponse était un peu .. fraîche ... mais pas violente, et il a trouvé sa réponse en cherchant sans que je le


    En passant, tu peux faire directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    intervalSorted =  sorted([I, J, K], cmpval)
    enfin c'est toi qui vois

    Allez, viens faire un , ça ira mieux
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  4. #4
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par pacificator Voir le message
    En passant, tu peux faire directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    intervalSorted =  sorted([I, J, K], cmpval)
    enfin c'est toi qui vois
    Cette méthode crée une nouvelle liste et l'autre modifie la liste en cours. Il se trouve que pour mon projet j'ai besoin d'une nouvelle liste donc merci pour ta remarque.

    Citation Envoyé par pacificator Voir le message
    Allez, viens faire un , ça ira mieux
    pacificator aurait-il un coeur ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Points : 102
    Points
    102
    Par défaut
    Tient, en passant, il y a même plus efficace pour ce que tu cherches à faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    intervalSorted = sorted([I, J, K], key=lambda x: x.min)
    Cela évite d'évaluer plusieurs fois le même élément pour de multiple comparaisons.

  6. #6
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Salut et merci pour cette solution très compacte. J'en reste bouche bé... En quoi elle est plus efficace si ce n'est pas trop long à expliquer.

    J'imagine qu'il faut réserver l'utilisation d'une fonction de comparaisons pour des tests de rangement ad hoc comme par exemple s'il y a besoin de comparer à la fois les valeurs de x.min et/ou de x.max.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Points : 102
    Points
    102
    Par défaut
    En fait l'utilisation de l'argument key au lien de cmp dans les fonction de tri permet de donner non pas la méthode de comparaison mais juste l'objet a comparer.

    L'avantage principal de l'utilisation de key, c'est que il y aura un appel et un seul a la fonction key par objet dans la liste a comparer contrairement a l'utilisation de cmp.

    On va faire un petit exemple, ca sera plus parlant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    L = [[4], [3], [2], [1]]
    def comp(x, y):
        global indexations
        indexations += 2
        return cmp(x[0], y[0])
     
    def key(x):
        global indexations
        indexations += 1
        return x[0]
     
    # Methode 1:
    indexations = 0
    L1 = sorted(L, cmp=comp)
    print "Methode 1, Nombre d'indexations: %d" %indexations
     
    # Methode 2:
    indexations = 0
    L2 = sorted(L, key=key)
    print "Methode 2, Nombre d'indexations: %d" %indexations
    Le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #Methode 1, Nombre d'indexations: 6
    #Methode 2, Nombre d'indexations: 4
    On est d'accord, ca n'est pas énorme comme différence. si maintenant on change L en [[4], [3], [2], [1]]*2. donc juste ayant un L de 8 elements au lieu de 4.

    Le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #Methode 1, Nombre d'indexations: 30
    #Methode 2, Nombre d'indexations: 8
    Voila l'avantage principal.

  8. #8
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Voilà une réponse d'une grande clarté.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trier une liste de classe selon un attribut
    Par pedro570 dans le forum Général Python
    Réponses: 4
    Dernier message: 06/05/2013, 18h04
  2. Trier une liste de pointeur de class
    Par lolaalol dans le forum C++
    Réponses: 10
    Dernier message: 26/01/2013, 03h42
  3. [Debutant(e)]Trier une liste
    Par LeDébutantJava dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 19/08/2004, 12h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo