Aller au contenu

Trier des données

Après des opérations de sélection et/ou de projection sur des données regroupées en table, il est souvent utile de renvoyer ces données triées selon certains critères.

Exemples

A partir d'une table de données contenant des informations sur des individus, on peut trier ces informations selon :

  • l'ordre alphabétique des noms ;
  • l'âge des individus ;
  • etc...

Méthode en Python

En Python, une table de données est représentée par un tableau de dictionnaires.
On peut donc (presque) utiliser un algorithme de tri usuel comme le tri par sélection ou le tri par insertion déjà étudiés en classe.

Pour gagner en efficacité, nous allons utiliser les fonctions de tri de tableau pré-programmées en Python :

  1. La fonction sorted() renvoie un nouveau tableau :

    resultat = sorted(tab_a_trier, key=critere_de_tri)
    

  2. La méthode .sort() trie le tableau tab en place (effet de bord) :

    tab_a_trier.sort(key=critere_de_tri)
    

On peut aussi ajouter le paramètre reverse = True pour obtenir un tri par ordre décroissant.

critere_de_tri est le nom d'une fonction qui prend pour paramètre un dictionnaire (par exemple) et qui renvoie le champ selon lequel le tableau doit être trié :

1
2
def critere_de_tri(dico):
    return dico[attribut]      # Indique l'attribut du dictionnaire sur lequel il faut appliquer le tri 

Exemple

On se réfère à nouveau à la table Personnes suivante :

num nom prenom genre annee_nais
1 Labrosse Adam M 2000
2 Gemlamorte Adèle F 1985
3 Auboisdormant Abel M 2001
4 Etpan Ahmed M 1975
5 Térieur Alain M 1999

On souhaite trier cette table par ordre décroissant d'année de naissance.

  1. Ouvrez un éditeur Python puis copiez/collez le code suivant :

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    def critere_date(dico):
        return ...
    
    def tri_date(table):
        """
        table - list, Table de données représentant une personne
        Sortie: None – Tri la table par ordre décroissant
                       d’année de naissance (effet de bord)
        """
        ...
    
    
    if __name__=='__main__':
        personnes = [{'id_personne': 1, 'nom': 'Labrosse', 'prenom': 'Adam', 'genre': 'M', 'annee_nais': 2000},
                     {'id_personne': 2, 'nom': 'Gemlamorte', 'prenom': 'Adèle', 'genre': 'F', 'annee_nais': 1985},
                     {'id_personne': 3, 'nom': 'Auboisdormant', 'prenom': 'Abel', 'genre': 'M', 'annee_nais': 2001},
                     {'id_personne': 4, 'nom': 'Etpan', 'prenom': 'Ahmed', 'genre': 'M', 'annee_nais': 1975},
                     {'id_personne': 5, 'nom': 'Térieur', 'prenom': 'Alain', 'genre': 'M', 'annee_nais': 1999}]
    
        ...
    

  2. Complétez en ligne 2 l'attribut du dictionnaire selon lequel il faut effectuer le tri souhaité.

    Une solution
    1
    2
    def critere_date(dico):
        return dico['annee_nais']
    
  3. Complétez en ligne 10 l'instruction permettant de réaliser un tri en place de la table passée en paramètre selon le critère de tri défini dans la question 2.

    Une solution

    Attention, le tri doit être décroissant...

     4
     5
     6
     7
     8
     9
    10
    def tri_date(table):
        """
        table - list, Table de données représentant une personne
        Sortie: None – Tri la table par ordre décroissant
                       d’année de naissance (effet de bord)
        """
        table.sort(key=critere_date, reverse=True)
    

  4. Complétez en ligne 20 l'instruction permettant de réaliser le tri de la table personnes selon les années de naissance des individus.

    Tests dans la console

    Vérifiez que vous obtenez les résultats suivants lors de l'appel dans la console :

    >>> personnes
    [{'id_personne': 3, 'nom': 'Auboisdormant', 'prenom': 'Abel', 'genre': 'M', 'annee_nais': 2001},
     {'id_personne': 1, 'nom': 'Labrosse', 'prenom': 'Adam', 'genre': 'M', 'annee_nais': 2000},
     {'id_personne': 5, 'nom': 'Térieur', 'prenom': 'Alain', 'genre': 'M', 'annee_nais': 1999},
     {'id_personne': 2, 'nom': 'Gemlamorte', 'prenom': 'Adèle', 'genre': 'F', 'annee_nais': 1985},
     {'id_personne': 4, 'nom': 'Etpan', 'prenom': 'Ahmed', 'genre': 'M', 'annee_nais': 1975}]
    

    Une solution
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    def critere_date(dico):
        return dico['annee_nais']
    
    def tri_date(table):
        """
        table - list, Table de données représentant une personne
        Sortie: None – Tri la table par ordre décroissant
                       d’année de naissance (effet de bord)
        """
        table.sort(key=critere_date, reverse=True)
    
    
    if __name__=='__main__':
        personnes = [{'id_personne': 1, 'nom': 'Labrosse', 'prenom': 'Adam', 'genre': 'M', 'annee_nais': 2000},
                        {'id_personne': 2, 'nom': 'Gemlamorte', 'prenom': 'Adèle', 'genre': 'F', 'annee_nais': 1985},
                        {'id_personne': 3, 'nom': 'Auboisdormant', 'prenom': 'Abel', 'genre': 'M', 'annee_nais': 2001},
                        {'id_personne': 4, 'nom': 'Etpan', 'prenom': 'Ahmed', 'genre': 'M', 'annee_nais': 1975},
                        {'id_personne': 5, 'nom': 'Térieur', 'prenom': 'Alain', 'genre': 'M', 'annee_nais': 1999}]
    
        tri_date(personnes)