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 indexation [Python 2.X]


Sujet :

Python

  1. #1
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut Tri avec indexation
    Bonjour à tous,

    alors mon soucis concerne le tri. J'ai exploité ce lien >>Tir<< sur lequel j'ai appris pas mal de choses, cependant j'ai pas trouvé mon bonheur

    alors mon soucis est le suivant :

    j'ai une liste qui contient des chaines de caractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     L = ["LUNDI", "MARDI", "MERCREDI", "JEUDI", "VENDREDI", "SAMEDI", "DIMANCHE"]
    et une autre liste qui contient des valeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Value = [0.2589, 0.84569, 1.26587, 4.5893, 1.02458, 8.0125, -1.8]
    Je souhaite trier ma liste de nombre du plus petit au plus grand tout en triant ma liste de chaines de caractères afin d'obtenir le résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    value=[-1.8, 0.2589, 0.84569, 1.02458, 1.26587, 4.5893, 8.0125]
    L= ["DIMANCHE", "LUNDI", "MARDI", "VENDREDI", "MERCREDI","JEUDI", "SAMEDI"]
    J'ai testé ce code :

    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 = ["LUNDI", "MARDI", "MERCREDI", "JEUDI", "VENDREDI", "SAMEDI", "DIMANCHE"]
     
    print L
     
    value = [0.2589, 0.84569, 1.26587, 4.5893, 1.02458, 8.0125, -1.8]
     
    print value
     
    print "********************************"
    conv = lambda i: L[i]
    value.sort(key=conv)
     
    print value
     
    T = []
    for i in range(0,len(L)):
     
        T.append(L[value[i]])
     
    print T
    et j'obtiens le message suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Traceback (most recent call last):
      File "C:/Users/user/Desktop/enveloppe/tri_indexe_list.py", line 11, in <module>
        value.sort(key=conv)
      File "C:/Users/user/Desktop/enveloppe/tri_indexe_list.py", line 10, in <lambda>
        conv = lambda i: L[i]
    TypeError: list indices must be integers, not float
    Je comprend que finalement il faut que la liste de mes valeurs soit des entiers, mais je souhaite trier une list contenant des float .

    Une idée ?

    Merci d'avance pour votre aide.

  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,

    Citation Envoyé par nekcorp Voir le message
    J'ai exploité ce lien >>Tir<< sur lequel j'ai appris pas mal de choses...
    En tout cas, tu as de bonnes sources...


    Le principe pour ton pb est très simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    value = [0.2589, 0.84569, 1.26587, 4.5893, 1.02458, 8.0125, -1.8]
    L = ["LUNDI", "MARDI", "MERCREDI", "JEUDI", "VENDREDI", "SAMEDI", "DIMANCHE"]
     
    index = list(range(0,len(value))) # => [0, 1, 2,..., 6]
     
    index.sort(key=lambda i: value[i]) # liste des index pour prendre les éléments de value triés 
     
    print(index)
    print([L[i] for i in index])
    Ce qui affiche le résultat attendu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [6, 0, 1, 4, 2, 3, 5]
    ['DIMANCHE', 'LUNDI', 'MARDI', 'VENDREDI', 'MERCREDI', 'JEUDI', 'SAMEDI']
    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
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2010
    Messages : 99
    Points : 143
    Points
    143
    Par défaut
    Bonjour.

    Tu peux aussi faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    value = [0.2589, 0.84569, 1.26587, 4.5893, 1.02458, 8.0125, -1.8]
    L = ["LUNDI", "MARDI", "MERCREDI", "JEUDI", "VENDREDI", "SAMEDI", "DIMANCHE"]
     
    print [x[1] for x in sorted(zip(value, L))]

  4. #4
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,



    En tout cas, tu as de bonnes sources...
    C'est si bien expliqué

    Le principe pour ton pb est très simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    value = [0.2589, 0.84569, 1.26587, 4.5893, 1.02458, 8.0125, -1.8]
    L = ["LUNDI", "MARDI", "MERCREDI", "JEUDI", "VENDREDI", "SAMEDI", "DIMANCHE"]
     
    index = list(range(0,len(value))) # => [0, 1, 2,..., 6]
     
    index.sort(key=lambda i: value[i]) # liste des index pour prendre les éléments de value triés 
     
    print(index)
    print([L[i] for i in index])
    Ce qui affiche le résultat attendu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [6, 0, 1, 4, 2, 3, 5]
    ['DIMANCHE', 'LUNDI', 'MARDI', 'VENDREDI', 'MERCREDI', 'JEUDI', 'SAMEDI']
    J'avais eu cette idée mais je sais pas pourquoi dans ma tête ça faisait usine à gaz, trier une liste d'index pour ensuite allé récupérer la valeur associé dans ma liste de départ.

    Encore merci tyrtamos et vraiment cool tes recettes Python

  5. #5
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par Biribibi Voir le message
    Bonjour.

    Tu peux aussi faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    value = [0.2589, 0.84569, 1.26587, 4.5893, 1.02458, 8.0125, -1.8]
    L = ["LUNDI", "MARDI", "MERCREDI", "JEUDI", "VENDREDI", "SAMEDI", "DIMANCHE"]
     
    print [x[1] for x in sorted(zip(value, L))]
    Merci Biribibi ça me fait deux façons de faire, je me le met sous le coude également.

  6. #6
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    L = ["LUNDI", "MARDI", "MERCREDI", "JEUDI", "VENDREDI", "SAMEDI", "DIMANCHE"]
    value = [0.2589, 0.84569, 1.26587, 4.5893, 1.02458, 8.0125, -1.8]
    conv = lambda i: L[i]
    value.sort(key=conv)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Traceback (most recent call last):
      File "C:/Users/user/Desktop/enveloppe/tri_indexe_list.py", line 11, in <module>
        value.sort(key=conv)
      File "C:/Users/user/Desktop/enveloppe/tri_indexe_list.py", line 10, in <lambda>
        conv = lambda i: L[i]
    TypeError: list indices must be integers, not float
    Je comprend que finalement il faut que la liste de mes valeurs soit des entiers, mais je souhaite trier une list contenant des float .
    Par contre tu avais compris de travers le message d'erreur.

    On peut, bien évidemment, trier une liste de floats : manquerait plus que ça !

    Là, le message t'indique que L[0.2589], et ben, "ça le fait pas" : les indices de listes doivent être des entiers et, là, ça ne te retournera pas "LUNDI".

    Je pense qu'il est tout aussi important de comprendre ce qui n'allait pas et bien analyser les messages d'erreur que de comprendre les solutions qui t'ont été proposées.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  7. #7
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par plxpy Voir le message
    Par contre tu avais compris de travers le message d'erreur.

    On peut, bien évidemment, trier une liste de floats : manquerait plus que ça !

    Là, le message t'indique que L[0.2589], et ben, "ça le fait pas" : les indices de listes doivent être des entiers et, là, ça ne te retournera pas "LUNDI".

    Je pense qu'il est tout aussi important de comprendre ce qui n'allait pas et bien analyser les messages d'erreur que de comprendre les solutions qui t'ont été proposées.
    Je m'étais mal exprimé.

    J'avais compris le message d'erreur, je travail sur des listes depuis un moment et j'arrives à analyser un message lorsque j'en ai un, et si je ne le comprend pas je viens poser une question directement concernant sur le message obtenu.

    Encore merci.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/11/2004, 19h16
  2. Pb de tri avec champs vide
    Par nesbla dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/06/2004, 17h42
  3. tri avec l'ordre UPDATE et incrementation d'une colonne
    Par Staron dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/02/2004, 08h48
  4. tri avec les champs vides en dernier
    Par r-zo dans le forum Requêtes
    Réponses: 11
    Dernier message: 03/09/2003, 13h40
  5. Création de table avec index
    Par Seb7 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/04/2003, 16h11

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