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 :

1
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 :

1
def note1(liste):
2
    """
3
    liste -- liste de notes
4
5
    renvoie le premier élément de liste
6
    """
7
    return liste[0]
8
9
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
10
notes.sort(key=note1)

On obtient :

1
>>> notes
2
[[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.

RemarqueFonction lambda

Python permet une syntaxe plus brève :

1
notes = [[8,12,9], [2,18,15], [14,13,17], [10,11,12]]
2
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 :

1
notes = [ {"C1": 8, "C2": 12, "C3": 9}, 
2
          {"C1": 2,"C2": 18,"C3": 15}, 
3
          {"C1": 14,"C2": 13,"C3": 17}, 
4
          {"C1": 10,"C2": 11,"C3": 12}
5
         ]
6
notes.sort(key= lambda x: x["C1"])