Comment trier une liste complexe ?

Résolu/Fermé
Ptiso Messages postés 1 Date d'inscription mardi 3 septembre 2013 Statut Membre Dernière intervention 3 septembre 2013 - 3 sept. 2013 à 14:17
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 - 3 sept. 2013 à 23:14
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

heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
Modifié par heyquem le 3/09/2013 à 23:14
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