2
votes

Comment trier une liste de chaînes contenant des nombres et des caractères

J'ai list = ['1-10', '1-9', '1-8', '1-11a', '1-12', '1-11b', '1- 11 '] qui devrait être trié de cette façon:

list.sort(key=lambda a: a.split('-')[1])

Comment puis-je faire cela?

Je peux séparer les chaînes via la méthode split pour ne me soucier que de ce qui se trouve après le - .

sortedlist = ['1-8', '1-9', '1-10', '1-11', '1-11a', '1-11b', '1-12'].

mais alors 1-10, 1-11 et ainsi de suite viennent avant 1-8. Et je ne peux pas utiliser int () à cause des 'a' et 'b'.


0 commentaires

3 Réponses :


0
votes

Utilisation de Regex.

Ex:

['1-8', '1-9', '1-10', '1-11', '1-11a', '1-11b', '1-12']

Sortie:

import re
l = ['1-10', '1-9', '1-8', '1-11a', '1-12', '1-11b', '1-11']

l.sort(key=lambda a: (int(re.search(r"\-(\d+)[a-z]*", a).group(1)), re.search(r"\-\d+([a-z]*)", a).group(1)))
print(l)


0 commentaires

0
votes

Utilisation d'un tuple dans lambda comme paramètre de clé :

import re

lst = ['1-10', '1-9', '1-8', '1-11a', '1-12', '1-11b', '1-11'] 

lst.sort(key=lambda a: (int(re.search(r'\d+', a.split('-')[1]).group()), len(a)))

print(lst)
# ['1-8', '1-9', '1-10', '1-11', '1-11a', '1-11b', '1-12']


0 commentaires

0
votes

Utilisation du module re :

['1-8', '1-9', '1-10', '1-11', '1-11a', '1-11b', '1-12']

Imprime:

import re

l = ['1-10', '1-9', '1-8', '1-11a', '1-12', '1-11b', '1-11']

j = [l[i[0]]
    for i in sorted(
            [(i2, *g)
             for i2, i in enumerate(l)
             for g in re.findall(r'(\d+)-(\d+)(\w?)', i)],
        key=lambda k: (int(k[1]), int(k[2]), k[3]))]

print(j)


0 commentaires