Trier une table de données☘
Pour trier une table de données, Python possède des fonctions de tri pré-programmées.
Parmi elles, la méthode .sort()
trie la liste Python en place (effet de bord) :
liste_a_trier.sort(key=critere_de_tri)
critere_de_tri
est le nom d'une fonction qui prend pour paramètre le
tableau (type list
en Python) à trier et qui renvoie le champ selon lequel
le tableau doit être trié. On peut aussi ajouter le paramètre reverse = True
pour obtenir un tri par ordre décroissant.
Exemple n°1☘
On considère les notes de quatre élèves obtenus lors de trois contrôles :
>>> notes = [ {"Prenom": "Zoé", "C1": 8, "C2": 12, "C3": 9},
{"Prenom": "Laurent", "C1": 2, "C2": 18, "C3": 15},
{"Prenom": "Brahim", "C1": 14, "C2": 13, "C3": 17},
{"Prenom": "Julie", "C1": 2, "C2": 11, "C3": 12}]
Pour définir un critère de tri selon les résultats du premier contrôle, il faut :
-
Définir la fonction correspondante, qui renvoie la valeur du champ correspondant au premier contrôle pour n'importe quel dictionnaire (
dico
est un nom de dictionnaire « générique ») :>>> def C1(dico): return dico["C1"]
-
Appliquer la méthode
.sort()
à la table de données en utilisant le critère défini en 1. :>>> notes.sort(key=C1)
-
La table est triée selon les résultats du premier contrôle. On peut s'en assurer en appelant cette table :
>>> notes [{'Prenom': 'Laurent', 'C1': 2, 'C2': 18, 'C3': 15}, {'Prenom': 'Julie', 'C1': 2, 'C2': 11, 'C3': 12}, {'Prenom': 'Zoé', 'C1': 8, 'C2': 12, 'C3': 9}, {'Prenom': 'Brahim', 'C1': 14, 'C2': 13, 'C3': 17}]
Exemple n°2☘
On considère (à nouveau) les notes de quatre élèves obtenus lors de trois contrôles :
>>> notes = [ {"Prenom": "Zoé", "C1": 8, "C2": 12, "C3": 9},
{"Prenom": "Laurent", "C1": 2, "C2": 18, "C3": 15},
{"Prenom": "Brahim", "C1": 14, "C2": 13, "C3": 17},
{"Prenom": "Julie", "C1": 2, "C2": 11, "C3": 12}]
Pour avoir les données triées selon les résultats du premier contrôle et par ordre alphabétique de prénom, il faut :
-
Définir une fonction qui renvoie ces critères dans l'ordre recherché :
>>> def C1_prenom(dico): return dico["C1"], dico["Prenom"]
-
Appliquer la méthode
.sort()
à la table de données en utilisant le critère défini en 1. :>>> notes.sort(key=C1_prenom)
-
La table est triée selon les résultats du premier contrôle et par ordre alphabétique de prénom. On peut s'en assurer en appelant cette table :
>>> notes [{'Prenom': 'Julie', 'C1': 2, 'C2': 11, 'C3': 12}, {'Prenom': 'Laurent', 'C1': 2, 'C2': 18, 'C3': 15}, {'Prenom': 'Zoé', 'C1': 8, 'C2': 12, 'C3': 9}, {'Prenom': 'Brahim', 'C1': 14, 'C2': 13, 'C3': 17}]
Remarque
On aurait pu conserver la fonction C1()
de l'exemple n°1 puis créer
la fonction prenom()
renvoyant comme critère la valeur de la clé
'Prenom'
d'un dictionnaire :
>>> def prenom(dico):
return dico["Prenom"]
notes
, d'abord avec le
critère de la fonction prenom()
, puis avec le critère de la fonction
C1()
, on obtient le même résultat que ci-dessus :
>>> notes.sort(key=prenom)
>>> notes.sort(key=C1)
>>> notes
[{'Prenom': 'Julie', 'C1': 2, 'C2': 11, 'C3': 12},
{'Prenom': 'Laurent', 'C1': 2, 'C2': 18, 'C3': 15},
{'Prenom': 'Zoé', 'C1': 8, 'C2': 12, 'C3': 9},
{'Prenom': 'Brahim', 'C1': 14, 'C2': 13, 'C3': 17}]
L'ordre du tri précédent est conservé car le tri appliqué par Python est
dit stable :
« si deux éléments sont égaux vis à vis du tri appliqué, alors ils
restent dans l'ordre dans lequel ils étaient au départ. »
Vous pouvez lire, par exemple, ce paragraphe de wikipedia pour en savoir plus sur cette notion.