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 :

Problème avec sorted [Python 3.X]


Sujet :

Python

  1. #1
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut Problème avec sorted
    Bonjour,
    Je vous présente mon problème.
    Voici une liste triée avec sorted ainsi que le type de chaque élément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    liste_totale_int=[liste_noms,liste_prenoms,liste_class_reel,liste_class_off,liste_evolut]
    print("colonne 4 :\n",liste_totale_int[4])
    print("colonne triée :\n",sorted(liste_totale_int[4],reverse=True))
    print("types :")
    for el in liste_totale_int[4]:
        print(type(el),end = '|')
    Le résultat, sans surprise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    colonne 4 :
     [1.2, 1.2, 31.7, -17.8, 7.7, -11.8, -11.8, 26.7, -3.8, 32.2, -43.8, 4.7, -4.6, 0.4, 62.5, 11.7, 7.7, 43.7, -13.3, -21.8, 0.7, -24.3, 12.3, 26.8, -0.3, 19.2, 10.2, 19.2, 7.2, 17.4, 9.7, 33.5, -21.3, -6.1, 20.5, -14.5, 0.7, 1.7, 24.7, 0.2, -17.1, 10.8, 25.2, 6.2, 0.2, -5.3, -18.6, 2.7, 0.4, -10.5, -0.3, 13.7, -2.6, 0.2, 1.9, 37.3, -10.3, -0.3, 0.2, 13.8, 4.2, -18.5, -21.8, -1.3, 13.9, -4.8, -20.8, 0.0, 0.0, 0.0, -2.8, -3.0, -12.0]
    colonne triée :
     [62.5, 43.7, 37.3, 33.5, 32.2, 31.7, 26.8, 26.7, 25.2, 24.7, 20.5, 19.2, 19.2, 17.4, 13.9, 13.8, 13.7, 12.3, 11.7, 10.8, 10.2, 9.7, 7.7, 7.7, 7.2, 6.2, 4.7, 4.2, 2.7, 1.9, 1.7, 1.2, 1.2, 0.7, 0.7, 0.4, 0.4, 0.2, 0.2, 0.2, 0.2, 0.0, 0.0, 0.0, -0.3, -0.3, -0.3, -1.3, -2.6, -2.8, -3.0, -3.8, -4.6, -4.8, -5.3, -6.1, -10.3, -10.5, -11.8, -11.8, -12.0, -13.3, -14.5, -17.1, -17.8, -18.5, -18.6, -20.8, -21.3, -21.8, -21.8, -24.3, -43.8]
    types :
    <class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|<class 'float'>|
    Mais si je fais cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste_triee = sorted(liste_totale_int, key=lambda col:col[4],reverse=True)
    J'ai le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        liste_triee = sorted(liste_totale_int, key=lambda col:col[4],reverse=True)
     
    TypeError: unorderable types: str() < float()
    Je pense bien comprendre le message et j'imagine que la raison est que les éléments des sous-listes (liste_noms, ...) ne sont pas des float, mais je ne comprends pas ce comportement. Une explication (et éventuellement une solution) me rendrait service.
    A bientôt.
    Pas d'aide par mp.

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 813
    Points : 7 102
    Points
    7 102
    Par défaut
    Bonjour,

    Expliqué je veux bien mais quoi ? Le message d'erreur me semble suffisamment explicite.

    La solution est de traiter dans une fonction le cas des chaînes et l'utiliser dans le paramètre key de la fonction sorted, pourquoi pas avec isinstance pour que la comparaison se fasse sur certains types ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    J'ai dû mal comprendre alors :
    Pour moi, liste_totale_int était triée en fonction de sa dernière colonne, qui ne contient que des réels.

    Edit :
    Lorsque je fais cela (et c'est exactement ce que je souhaite réaliser), cela fonctionne correctement alors que j'ai des éléments de type str :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    eleves = [["A", 14, 16],["B", 12, 15],["C", 14, 18],["D", 11, 12]]
    print(sorted(eleves))
    print(sorted(eleves,key=lambda col:col[2]))
    Pas d'aide par mp.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Lorsque je fais cela (et c'est exactement ce que je souhaite réaliser), cela fonctionne correctement alors que j'ai des éléments de type str :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    eleves = [["A", 14, 16],["B", 12, 15],["C", 14, 18],["D", 11, 12]]
    print(sorted(eleves))
    print(sorted(eleves,key=lambda col:col[2]))
    Vous avez plutôt çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> list(zip(*eleves))
    [('A', 'B', 'C', 'D'), (14, 12, 14, 11), (16, 15, 18, 12)]
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Cela aurait pu mais non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste_totale_int=[liste_noms,liste_prenoms,liste_class_reel,liste_class_off,liste_evolut]
    avec 5 listes donc (et pas des tuples).

    Ah mais oui, suis-je bête !!!!
    Merci
    Pas d'aide par mp.

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 813
    Points : 7 102
    Points
    7 102
    Par défaut
    tuples ou listes, pas de différence pour faire le tri avec sorted, il suffit d'utiliser l'interpréteur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> sorted((12, 45, 6))
    [6, 12, 45]
    wiztricks a raison, la forme semble être celle qu'il propose, pourquoi ne pas customiser tes données, ça commence à faire beaucoup de listes à placer manuellement. Créer un objet avec ses attributs rendra plus simple le tri. Il y a un exemple en fin de page sur ce site.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Merci
    Je n'ai pas trouvé de solution plus simple que de transposer 2 fois avec un sorted entre les 2.
    Cela me convient, mais j'imagine qu'il y a plus simple...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    eleves_2 = [['A', 'B', 'C', 'D'], [14, 12, 14, 11], [16, 15, 18, 12]]
    eleves_3 = list(map(list, zip(*eleves_2)))
    eleves_4 = sorted(eleves_3,key=lambda col:col[-1],reverse=True)
    eleves_5 = list(map(list, zip(*eleves_4)))
    print(eleves_5)
    Pas d'aide par mp.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/05/2012, 10h24
  2. Problème avec Collection.sort
    Par IMPRO dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 04/02/2012, 12h00
  3. perl objet problème avec l'instruction "sort"?
    Par lecosmotien dans le forum Langage
    Réponses: 10
    Dernier message: 01/10/2010, 16h05
  4. problème avec sort() et operator<
    Par [Hugo] dans le forum C++
    Réponses: 6
    Dernier message: 25/02/2008, 18h19
  5. Problème avec Sort() sur un TList
    Par ViNzZz dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/08/2006, 14h45

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