Trier suivant un champ
Pour présenter une liste, il est souvent utile de la présenter triée. Mais lorsque cette liste est composée de plusieurs champs, on peut trier suivant chacun de ces champs.
Par exemple, notre liste de passagers du Titanic peut être triée suivant leurs noms, ou suivant leurs âges, etc...
Méthode sort et key de Python
On dispose des notes de quatre élèves :
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
(l'élève 0 a pour notes [8,12,9], l'élève 1 a pour notes [2,18,15]...).
On aimerait trier suivant les résultats de la première note. On peut écrire :
def note1(liste):
"""
liste -- liste de notes
renvoie le premier élément de liste
"""
return liste[0]
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
notes.sort(key=note1)
On obtient :
>>> notes
[[2, 18, 15], [8, 12, 9], [10, 11, 12], [14, 13, 17]]
On voit que les listes de notes ont été triées dans l'ordre croissant de la première note.
Remarque : Fonction lambda
Python permet une syntaxe plus brève :
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
notes.sort(key= lambda x: x[0])
La fonction est définie de façon plus brève avec une expression lambda.
L’expression commence par l’expression lambda suivie des paramètres, ici le paramètre est x, puis le corps de la fonction x[0].
On peut évidemment définir un tri de façon analogue avec une liste de dictionnaires. Tri en ordre croissant des notes du premier contrôle :
notes = [ {"C1": 8, "C2": 12, "C3": 9},
{"C1": 2,"C2": 18,"C3": 15},
{"C1": 14,"C2": 13,"C3": 17},
{"C1": 10,"C2": 11,"C3": 12}
]
notes.sort(key= lambda x: x["C1"])