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 dans une liste


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    fac
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : fac
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Par défaut tri dans une liste
    Bonjour à tous,

    Voila mon petit problème:

    J'utilise la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    path= askdirectory(title='\n Emplacement dossier :',initialdir=os.getcwd())
    path=str(path)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listing=os.listdir(path)
    pour établir la liste d'images dans mon fichier.
    Le problème est qu'il me les classe de la façon suivante:
    Tv1.tif puis Tv10.tif Tv11...Tv19, Tv2, Tv21.tif ...
    or j'aimerai les classer en Tv1.tif , Tv2.tif, Tv3.tif... Tv21.tif

    Pourriez vous m'aider?

  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,

    C'est assez facile: il faut dire à la méthode qui fait le tri (=.sort) ce qu'elle doit considérer pour comparer 2 éléments. Ici, c'est le nombre entier qu'il faut extraire du nom de fichier avec : v[2:-4].

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    liste = ["Tv100.tif", "Tv2.tif","Tv19.tif","Tv10.tif","Tv20.tif","Tv1.tif"]
     
    liste.sort(key = lambda v: int(v[2:-4]))
     
    print liste
     
    ['Tv1.tif', 'Tv2.tif', 'Tv10.tif', 'Tv19.tif', 'Tv20.tif', 'Tv100.tif']

  3. #3
    Membre Expert 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 : 60
    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
    Par défaut
    Bonjour

    Tu peux trier ta liste de noms de fichiers via la méthode sort.

    Si tu ne précises aucun argument, le tri n'aura aucun effet sur ta liste car les noms de tes fichiers sont déjà triés (mais alphabétiquement).

    En Python 2.x(*),
    • soit tu précises la fonction de comparaison de deux éléments de la liste via l'argument cmp
    • soit (c'est le mieux dans ton cas), tu fournis via l'argument key une fonction qui prend en argument 1 valeur (ce sera, successivement, chaque nom de fichier) et qui retourne ce sur quoi doit porter le tri : ici, l'entier après 'Tv' et avant le point. Une fonction lambda fera parfaitement l'affaire.



    Tu as le détail là http://docs.python.org/library/stdty...pesseq-mutable


    * : en version 3, je sais qu'il y a un (petit) changement mais je ne l'ai plus en tête.

  4. #4
    Membre averti
    Homme Profil pro
    fac
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : fac
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Par défaut
    Super les gars! Merci

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

    C'est bien gentil tout çà mais les noms retournés par os.listdir sont ceux des fichiers trouvés dans un répertoire: ne pas exclure que de temps en temps, une erreur humaine y pose 'autre chose'.
    Dans ce cas, la conversion effectuée par "int" plantera le programme sans plus d'information.


    => s'assurer que les "nom"s retournés sont bien construits, i.e. de la forme "TvXX.tif".
    • commencent par "Tv"
    • se terminent bien par ".tif"
    • qu'il y a quelque chose entre les deux,
    • et que la chose est un entier!



    Ce qui ajoute quelques bricoles à int(name[2:-4]):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def get_ident(name):
        if name.startswith("tv") and name.endswith(".tif"):
              s = name[2:-4]
              if len(s):
                   try:
                       v = int (s)
                   except ValueError:
                        pass
    Une autre conséquence est qu'en supposant qu'os.listdir pourrait retourner des choses pas trop propres, ben... il va falloir "filtrer" avant avant de les donner en pâture a sort.

    get_ident retournant "None" si le pattern du nom n'est pas bon çà donne une "base" pour construire le filtre et signaler proprement les "déviants".

    Une autre solution est d'aligner l'ordre alphabétique avec celui des entiers en imposant des noms à longueur fixe.
    i.e. plutôt que des noms Tv1.tif ou tv12.tif on aurait tv0001.tif, tv0012.tif.
    Cela limite le nombre de fichiers (ici 9999).
    Dans ce cas, plus besoin de trier ce qui sera retourné par os.listdir.
    note: il faut toujours s'assurer que les noms sont de la forme attendue.

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

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    on peut faire 2 .sort() aussi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> liste = ["Tv100.tif", "Tv2.tif","Tv19.tif","Tv10.tif","Tv20.tif","Tv1.tif"]
    >>> liste.sort()
    >>> liste.sort(key=len)
    >>> liste
    ['Tv1.tif', 'Tv2.tif', 'Tv10.tif', 'Tv19.tif', 'Tv20.tif', 'Tv100.tif']
    ou alors comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> liste = ["Tv100.tif", "Tv2.tif","Tv19.tif","Tv10.tif","Tv20.tif","Tv1.tif"]
    >>> liste.sort(key=lambda x:(len(x),x))
    >>> liste
    ['Tv1.tif', 'Tv2.tif', 'Tv10.tif', 'Tv19.tif', 'Tv20.tif', 'Tv100.tif']

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Bien vu josmiley.
    - 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. Récupération de données en SQL et tri dans une liste
    Par skurty dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 24/03/2010, 23h55
  2. Faire un tri dans une liste
    Par patmar83 dans le forum IHM
    Réponses: 5
    Dernier message: 17/12/2009, 08h37
  3. [DisplayTag] Tri dans une liste paginée
    Par guntzerp dans le forum Taglibs
    Réponses: 4
    Dernier message: 15/09/2009, 17h03
  4. tri dans une liste déroulante
    Par paolo2002 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 27/02/2008, 12h45

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