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 classe selon un attribut


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2011
    Messages : 51
    Points : 41
    Points
    41
    Par défaut Trier une liste de classe selon un attribut
    Bonjour,

    Je cherche a trier une liste de classe selon un attribut. Voici ma classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class case_instance:
     
        x = int
        def __init__(self, x):
            self.x = x

    J'ai une liste d'instances de cette classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    monchiffre = random.randint(1, 15)
    maliste = []
    for i in range(81):
    maliste.append(case_instance(monchiffre))
    Ce que je veux, c'est trier ma liste nommee "maliste" (tres original comme nom, je sais lol) selon l'attribut "x" de ma classe, du plus petit au plus grand.


    Qq sait-il comment proceder svp ?



    Merci d'avance

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    A priori, ça devrait se faire comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maliste.sort(key = lambda v: v.x)
    Il s'agit ici du tri selon la variable d'instance x (self.x) et non selon la variable de classe x.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Une remarque, dans le code donné x est attribut de classe dont on use comme attribut d'instance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class case_instance:
     
        x = int  # << class attribute
        def __init__(self, x):
            self.x = x # << instance attribute
    Si x est invariant pour toutes les instances, l'attribut de classe est justifié mais, s'il varie pour chaque instance alors il faut supprimer x = int (qui, par ailleurs, ne sert à rien en Python).

    Comme il s'agit de trier sur la valeur de x, je suppose donc que c'est attribut d'instance dans ce cas.

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Oui, c'est bizarre:

    La variable d'instance self.x sera initialisée avec l'argument x=monchiffre passé à l'instanciation de la classe.

    Quand à la variable de classe x, elle est initialisée avec int, c'est à dire qu'on pourra s'en servir à l'intérieur de la classe en remplacement de la fonction "int": x(3.25)=>3. En cas d'ambiguïté, il faudra préfixer avec le nom de la classe: case_instance.x(3.25)=>3.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Oui mais à la condition de ne pas réutiliser x comme attribut d'instance, comme c'est le cas ici où self.x masque cls.x

    test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class case_instance(object):
        x = int
        def __init__(self, x):
            self.x = x
     
    c = case_instance(5)
    cc = case_instance(20)
     
    print cc.x
    print c.x
    print case_instance.x(2.5)
    print c.x(2.5)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    20
    5
    2
    Traceback (most recent call last):
      File "attrib.py", line 12, in <module>
        print c.x(2.5)
    TypeError: 'int' object is not callable
    Mais peut-être que pedro570 pensait devoir instancier d'abord un int avant de s'en servir. Ce qui n'est pas nécessaire en Python.

Discussions similaires

  1. Trier une liste de pointeur de class
    Par lolaalol dans le forum C++
    Réponses: 10
    Dernier message: 26/01/2013, 03h42
  2. Trier une liste de "classes"
    Par rambc dans le forum Général Python
    Réponses: 7
    Dernier message: 08/07/2009, 16h30
  3. comment trier les instances d'une classe selon un attribut choisi
    Par rddev dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 29/05/2007, 00h01
  4. [c#] Trier une liste de nombres liés.
    Par Joad dans le forum ASP.NET
    Réponses: 13
    Dernier message: 11/05/2005, 11h17
  5. [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