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 :

Tri avec fonction de comparaison personnalisée (Python 3)


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 71
    Points : 56
    Points
    56
    Par défaut Tri avec fonction de comparaison personnalisée (Python 3)
    Bonjour à tous,

    Voici une classe d’objets simplifiée pour illustrer mon problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class MonObjet :
        def __init__ (self, ):
            self.var1 = sString
            self.var2 = sString
            ...
     
        def comp1 (self, other):
            ...
     
        def comp2 (self, other):
            ...
     
        def comp3 (self, other):
            ...
    Les fonctions compX sont des fonctions de comparaison personnalisées qui me permettent de trier des listes d’objets MonObjet de façon différente en passant comme paramètre la fonction de comparaison adéquate dans sort().
    Ces tris se faisaient en comparant plusieurs attributs (string) des objets.

    Problème: Ça fonctionnait bien dans Python 2. Mais je suis passé à Python 3.

    Et il n’est plus possible de passer des fonctions de comparaison dans sorted.
    http://docs.python.org/3.1/library/f...=sorted#sorted
    On ne peut désormais passer qu’une fonction à un argument pour faire une clé.

    La solution proposée pour combler ce manque me semble assez horrible:
    http://code.activestate.com/recipes/576653/

    Quelqu’un a une idée pour une solution plus élégante?

    Merci d’avance.

    PS. Qu’est-ce qui a pris aux dévs de Python 3 de virer ces possibilités de comparaison? Je me le demande encore.

  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 751
    Points
    1 751
    Par défaut
    Peux-tu donner un exemple concret de ce que tu cherches à faire ? Que compares-tu ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 71
    Points : 56
    Points
    56
    Par défaut
    Voici un exemple simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        def comp1 (self, other):
            var = cmp(self.var1, other.var1)
            if var == 0 :
                return cmp(self.var2, other.var2)
            return var
     
        def comp2 (self, other):
            var = cmp(self.var2, other.var2)
            if var == 0 :
                return cmp(self.var1, other.var1)
            return var
    En clair,
    - comp1 compare les éléments sur l’attribut var1. Mais si ces deux attributs sont identiques, il fait la comparaison sur var2.
    - comp2 compare les éléments sur l’attribut var2. Mais si ces deux attributs sont identiques, il fait la comparaison sur var1.

    En bref, ça permet de trier les éléments d’une liste sur plusieurs critères.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Dans ce cas cela me semble simple, il suffit d'utiliser un tuple comme clé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sorted(l, key=lambda x: (x.var1, x.var2))
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sorted(l, key=lambda x: (x.var2, x.var1))

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 71
    Points : 56
    Points
    56
    Par défaut
    Oui, merci.
    Il y avait bien longtemps que je n’avais pas touché à Python, et je tombe des nues. J’ignorais que Python savait ordonner les tuples!
    Je constate que je n’avais pas l’esprit assez «pythonique».

    Par contre, si je vois maintenant comment procéder dans bien des cas, il va falloir que je médite sur les cas les plus complexes. Je rouvrirai ce fil si besoin.

    Encore merci pour l’aide.

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

Discussions similaires

  1. Programme de tri avec fonctions
    Par adri010 dans le forum Débuter
    Réponses: 1
    Dernier message: 02/05/2010, 18h30
  2. Tri avec une fonction surchargee
    Par vandamme dans le forum SL & STL
    Réponses: 4
    Dernier message: 28/09/2007, 01h20
  3. Réponses: 1
    Dernier message: 28/08/2007, 19h18
  4. [VBA-E] Pb Comparaison De Deux Colonnes Avec Fonction If
    Par gromorice dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/03/2007, 05h57
  5. find() de std::set avec fonction de comparaison
    Par Biglo dans le forum SL & STL
    Réponses: 3
    Dernier message: 13/01/2006, 08h50

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