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'.
3 Réponses :
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)
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']
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)