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)