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 :

comment trier une liste complexe ?


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 7
    Points : 11
    Points
    11
    Par défaut comment trier une liste complexe ?
    Bonjour,
    j'aimerais savoir comment trier une liste complexe du type:

    liste = ['6#P-,[-.<.,<]#!]][[>><<..--,,++\n', '6#P<+[.,+.]<>#!++,,--..<<>>[[]]\n', '6#P+[<+.<.]<>#!++,,--..<<>>[[]]\n', '6#P><+<,[.+.]#!++,,--..<<>>[[]]\n', '6#P><+[[+..],#!++,,--..<<>>[[]]\n', '6#P<-[.<.-><]#!]][[>><<..--,,++\n', '6#P+[[+..],+,#!++,,--..<<>>[[]]\n', '6#P-[.-.]-,-[#!]][[>><<..--,,++\n', '6#P-<[.-.][]+#!]][[>><<..--,,++\n', '6#P-+,-.[.-.]#!]][[>><<..--,,++\n']

    comme le premier argument de chaque element est de type str() un simple :
    liste.sort()

    renvois des truc etrange en cas de comparaison entre par exemple :
    [66,6,7,111]

    le sortie serait :
    >>> [111,6,66,7]
    alors que je souhaiterais:
    >>> [6,7,66,111]

    Cordialement.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Coucou,
    Le résultat est un peu normal puisque le tri s'effectue sur des chaînes de caractères (et "1" est avant "9", donc "100000" est avant "9")…
    Pour éviter cela, l'une des possibilité est d'utiliser l'option key (qui définit la fonction utilisée pour réaliser le tri) pour que le tri s'effectue sur des entiers…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>>a=['1',  '100', '99']
    >>>a.sort()
    >>> a
    ['1', '100', '99']
    >>> a.sort(key=lambda x: int(x))
    >>> a
    ['1', '99', '100']
    PS: à la place d'une lambda, une fonction est utilisable.
    PS2: il faut, bien sûr, adapter selon la liste (ici, la liste contient des caractères qui vont provoquer une erreur de int… A vous de réaliser une fonction qui pallie ceci)
    Clodion

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 7
    Points : 11
    Points
    11
    Par défaut
    ça ne marche pas voilà plus d'info :

    le fichier a parser:

    6#P+[.,.+<]<>#!++,,--..<<>>[[]]
    6#P-<,[-.,<.]#!]][[>><<..--,,++
    6#P<.-[.,-.]<#!]][[>><<..--,,++
    6#P,,+[,..<+]#!++,,--..<<>>[[]]
    14#P+[+.+,.-.]#!++,+,-,-.-..<<<>>>[[[]]]
    6#P+[+.<.][].#!++,,--..<<>>[[]]
    14#P-.-[..,.-]#!]]][[[>>><<<...---,,,+++
    6#P+[..+]>-[,#!++,,--..<<>>[[]]
    6#P<++[<,..+]#!++,,--..<<>>[[]]
    14#P,-[-...]<.#!]]][[[>>><<<...---,,,+++

    le parseur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fichier = open("fichierC.txt",'r')
    lecture = fichier.readlines()
    print "nombre de lignes: %d"%len(lecture)
    lecture.sort(key=lambda x: int(x))
    print lecture
    la sortie:
    nombre de lignes: 10
    Traceback (most recent call last):
    File "triBFtest.py", line 4, in <module>
    lecture.sort(key=lambda x: int(x))
    File "triBFtest.py", line 4, in <lambda>
    lecture.sort(key=lambda x: int(x))
    ValueError: invalid literal for int() with base 10: '6#P+[.,.+<]<>#!++,,--..<<>>[[]]\n'


    ------------------
    (program exited with code: 1)
    Press return to continue

    et sur le meme fichier voila la sortie de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fichier = open("fichierC.txt",'r')
    lecture = fichier.readlines()
    print "nombre de lignes: %d"%len(lecture)
    lecture.sort(key=lambda x: str(x))
    for element in lecture :
    	print element,
    nombre de lignes: 10
    14#P+[+.+,.-.]#!++,+,-,-.-..<<<>>>[[[]]]
    14#P,-[-...]<.#!]]][[[>>><<<...---,,,+++
    14#P-.-[..,.-]#!]]][[[>>><<<...---,,,+++
    6#P+[+.<.][].#!++,,--..<<>>[[]]
    6#P+[.,.+<]<>#!++,,--..<<>>[[]]
    6#P+[..+]>-[,#!++,,--..<<>>[[]]
    6#P,,+[,..<+]#!++,,--..<<>>[[]]
    6#P-<,[-.,<.]#!]][[>><<..--,,++
    6#P<++[<,..+]#!++,,--..<<>>[[]]
    6#P<.-[.,-.]<#!]][[>><<..--,,++


    ------------------
    (program exited with code: 0)
    Press return to continue

  4. #4
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Coucou,
    Naturellement…
    Il serait peut-être bon d'adapter la fonction lambda (ou ici la fonction) pour réaliser un tri sur la liste (cf réponse précédente), non?

    Pour être plus explicite (en supposant que le tri ne se fasse que sur le nombre débutant chaque item), il faut créer une fonction qui renvoie:
    si liste[i]= "6#P+[.,.+<]<>#!++,,--..<<>>[[]]"
    il faut que f(liste[i]) renvoie 6 (l'entier, pas la chaîne).

    Clodion

  5. #5
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Salut,
    comme l'a mentionné Clodion, tu dois te charger de spécialiser ta fonction selon la structure de tes données. En supposant par-exemple que toutes les lignes commencent par un nombre. Tu peux te servir d'une expression régulière pour récupérer le nombre en début de chaque chaine.

    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
    22
    23
    24
    25
    26
    27
    import re
     
    lecture = """6#P+[.,.+<]<>#!++,,--..<<>>[[]]
    6#P-<,[-.,<.]#!]][[>><<..--,,++
    6#P<.-[.,-.]<#!]][[>><<..--,,++
    6#P,,+[,..<+]#!++,,--..<<>>[[]]
    14#P+[+.+,.-.]#!++,+,-,-.-..<<<>>>[[[]]]
    6#P+[+.<.][].#!++,,--..<<>>[[]]
    14#P-.-[..,.-]#!]]][[[>>><<<...---,,,+++
    6#P+[..+]>-[,#!++,,--..<<>>[[]]
    6#P<++[<,..+]#!++,,--..<<>>[[]]
    14#P,-[-...]<.#!]]][[[>>><<<...---,,,+++""".split("\n")
     
    def getInt(arg):
        """retourne le nombre situe en debut de la chaine <arg>,
            le <^> specifie que l'element doit etre en debut de la chaine,
            le <\d> specifie un chiffre,
            le <+> specifie au moins une apparition"""
        res = 0
        matched = re.search("^\d+", arg)
        if matched:
            res = int(matched.group())
        return res
     
     
    lecture.sort(key=getInt)
    for i in lecture: print i
    6#P+[.,.+<]<>#!++,,--..<<>>[[]]
    6#P-<,[-.,<.]#!]][[>><<..--,,++
    6#P<.-[.,-.]<#!]][[>><<..--,,++
    6#P,,+[,..<+]#!++,,--..<<>>[[]]
    6#P+[+.<.][].#!++,,--..<<>>[[]]
    6#P+[..+]>-[,#!++,,--..<<>>[[]]
    6#P<++[<,..+]#!++,,--..<<>>[[]]
    14#P+[+.+,.-.]#!++,+,-,-.-..<<<>>>[[[]]]
    14#P-.-[..,.-]#!]]][[[>>><<<...---,,,+++
    14#P,-[-...]<.#!]]][[[>>><<<...---,,,+++
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/03/2013, 13h26
  2. Réponses: 3
    Dernier message: 27/01/2009, 18h17
  3. Comment trier une liste dans un DBLoukupComboBox
    Par soror dans le forum Bases de données
    Réponses: 6
    Dernier message: 17/07/2007, 20h13
  4. Réponses: 2
    Dernier message: 13/07/2006, 22h18

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