Comment trier une liste complexe ?

Résolu
Ptiso Messages postés 1 Statut Membre -  
heyquem Messages postés 808 Statut Membre -
Bonjour,
j'aimerais savoir comment trier une liste complexe du type:

['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.

1 réponse

  1. heyquem Messages postés 808 Statut Membre 131
     
    Remarquer qu'il y a des chiffres aussi à l'intérieur des chaînes

    import re
    
    li = ['666#P-,[-.<.,<]#!]][[>><<..--,,++\n',
          '6#P<+[.,+.]<>#!]]',
          '66#P+[<+.<.]<>#!++,,--..<<>>[[]]\n',
          '111#P><+<,[.+.]#!++,,--..<<>>[[]]\n',
          '7#P><+[[+..],#!++,,--..<<>>[[]]\n',
          '6#P<+[.<.-><]73#!]]',
          '6#P<-[.<.-><]73#!]]',
          '6#P<-[.<.-><]70#!]]']
    print 'li'
    print '\n'.join(map(repr,li))
    
    print '---------------------'
    lu = li[:]
    lu.sort()
    print 'lu.sort()'
    print '\n'.join(map(repr,lu))
    
    print '---------------------'
    
    def modi(x,r = re.compile('(\d+)')):
        sp = r.split(x)
        for i in xrange(len(sp)):
            try: sp[i] = int(sp[i])
            except: pass
        return sp
    
    lu = li[:]
    print 'lu.sort(key = modi)'
    lu.sort(key = modi)
    print '\n'.join(map(repr,lu))


    résultat

    li
    '666#P-,[-.<.,<]#!]][[>><<..--,,++\n'
    '6#P<+[.,+.]<>#!]]'
    '66#P+[<+.<.]<>#!++,,--..<<>>[[]]\n'
    '111#P><+<,[.+.]#!++,,--..<<>>[[]]\n'
    '7#P><+[[+..],#!++,,--..<<>>[[]]\n'
    '6#P<+[.<.-><]73#!]]'
    '6#P<-[.<.-><]73#!]]'
    '6#P<-[.<.-><]70#!]]'
    ---------------------
    li.sort()
    '111#P><+<,[.+.]#!++,,--..<<>>[[]]\n'
    '6#P<+[.,+.]<>#!]]'
    '6#P<+[.<.-><]73#!]]'
    '6#P<-[.<.-><]70#!]]'
    '6#P<-[.<.-><]73#!]]'
    '66#P+[<+.<.]<>#!++,,--..<<>>[[]]\n'
    '666#P-,[-.<.,<]#!]][[>><<..--,,++\n'
    '7#P><+[[+..],#!++,,--..<<>>[[]]\n'
    ---------------------
    li.sort(key = modi)
    '6#P<+[.,+.]<>#!]]'
    '6#P<+[.<.-><]73#!]]'
    '6#P<-[.<.-><]70#!]]'
    '6#P<-[.<.-><]73#!]]'
    '7#P><+[[+..],#!++,,--..<<>>[[]]\n'
    '66#P+[<+.<.]<>#!++,,--..<<>>[[]]\n'
    '111#P><+<,[.+.]#!++,,--..<<>>[[]]\n'
    '666#P-,[-.<.,<]#!]][[>><<..--,,++\n'
    0