Aller au contenu

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 :

  1. 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"]
    

  2. Appliquer la méthode .sort() à la table de données en utilisant le critère défini en 1. :

    >>> notes.sort(key=C1)
    

  3. 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 :

  1. Définir une fonction qui renvoie ces critères dans l'ordre recherché :

    >>> def C1_prenom(dico):
            return dico["C1"], dico["Prenom"]
    

  2. Appliquer la méthode .sort() à la table de données en utilisant le critère défini en 1. :

    >>> notes.sort(key=C1_prenom)
    

  3. 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"]
En appliquant successivement le tri à la table 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.