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 d'une liste [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    développeur occasionnel
    Inscrit en
    Octobre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : développeur occasionnel

    Informations forums :
    Inscription : Octobre 2015
    Messages : 10
    Par défaut Tri d'une liste
    Bonjour,
    Je suis en train de passer mon programme de 2.7 à 3.5
    Les instances de ma liste sont des fichiers généalogiques de la forme suivante:
    o_durand_alain_1666.png
    Mon objectif est de faire un tri sur les dates.
    Mon script comprend donc:

    lambda v1:v2
    print(liste0.sort(liste0,key=lambda v1[-8:-4]:v2[-8:-4]))

    Cela ne marche pas: on me répond que la syntaxe est incorrecte.:(
    Quelqu'un peut-il m'aider?
    Merci d'avance
    J.

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    key sert à désigner quel élément doit être pris comme base de la comparaison pour le tri. Donc, il rentre l'élément de la liste "o_durand_alain_1666.png", et on doit prendre "o_durand_alain_1666.png"[-8:-4] => 1666. Cela donne comme argument lambda v: v[-8:-4]:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    liste0.sort(key=lambda v:v[-8:-4])
    print(liste0)
    La méthode .sort(...) modifie la liste "sur place" mais ne renvoie rien. Pour créer une nouvelle liste sans modifier list0, on peut utiliser la fonction sorted:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print(sorted(liste0, key=lambda v:v[-8:-4])

  3. #3
    Membre habitué
    Homme Profil pro
    développeur occasionnel
    Inscrit en
    Octobre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : développeur occasionnel

    Informations forums :
    Inscription : Octobre 2015
    Messages : 10
    Par défaut Tri d'une liste
    Cela marche. Merci et bonne journée
    J

  4. #4
    Membre habitué
    Homme Profil pro
    développeur occasionnel
    Inscrit en
    Octobre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : développeur occasionnel

    Informations forums :
    Inscription : Octobre 2015
    Messages : 10
    Par défaut Tri Python selon plusieurs critères
    Je cherche à trier la liste ci-dessus selon 2 critères:
    - critère principal: le nom (3eme caractère)
    - critère secondaire: l'année

    J'ai essayé la fonction suivante, évidemment sans succès:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def compare(v1, v2):
        if v1[2]<v2[2]:
            return -1
        elif v1[-8:-4]>v2[-8:-4]:
            return 1
        else:
            return 0
    print(liste.sort(compare()))
    Il y a sûrement mieux
    Merci d'avance
    J

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    En plus d'être rapide, la fonction de tri de Python est "stable", ce qui veut dire que l'ordre des éléments égaux de la liste à trier est conservé. On peut donc chainer les tris pour faire du tri multicritères:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    liste = [
    "o_durand2_alain_1666.png",
    "o_durand1_alain_1665.png",
    "o_durand2_alain_1662.png",
    "o_durand4_alain_1669.png",
    "o_durand2_alain_1667.png",
    "o_durand1_alain_1668.png"
    ]
    Version avec la fonction sorted (ne change pas la liste initiale):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    liste2 = sorted(liste, key=lambda v:v.split('_')[3])
    liste3 = sorted(liste2, key=lambda v:v.split('_')[1])
    for x in liste3:
        print(x)
    Version avec la méthode sort (tri sur place):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    liste.sort(key=lambda v:v.split('_')[3])
    liste.sort(key=lambda v:v.split('_')[1])
    for x in liste:
        print(x)
    On peut aussi trier une sous-liste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    liste2 = sorted(liste, key=lambda v: [v.split('_')[1], v.split('_')[3]])
    for x in liste2:
        print(x)
    Les 3 solutions donnant, bien sûr, le même résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    o_durand1_alain_1665.png
    o_durand1_alain_1668.png
    o_durand2_alain_1662.png
    o_durand2_alain_1666.png
    o_durand2_alain_1667.png
    o_durand4_alain_1669.png

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    multicritère, c'est aussi: sorted(liste, key=lambda s: (s[2], s[-8:-4])) i.e. la liste est triée en comparant les tuple (s[2], s[-8:-4]) suivant l'ordre alphabétique.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. [SQL] Tri d'une liste!!!
    Par frutix dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 03/02/2006, 10h00
  2. [Requête] Tri via une liste déroulante
    Par Burnout dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 09/01/2006, 18h16
  3. Tri d'une liste d'objet CObList
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 13/07/2005, 13h50
  4. [TRI] tri d'une list provenant de LabelValueBean
    Par Canou dans le forum Struts 1
    Réponses: 6
    Dernier message: 20/09/2004, 14h55
  5. tri d'une liste
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 09/01/2003, 18h08

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