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 :
-
La fonction
sorted()
renvoie un nouveau tableau :resultat = sorted(tab_a_trier, key=critere_de_tri)
-
La méthode
.sort()
trie le tableautab
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 |
|
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.
-
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}] ...
-
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']
-
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)
-
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)