Aller au contenu

Tri d'une table

Pour de nombreuses opérations, et pour une plus grande lisibilité, ou peut vouloir réorganiser les lignes de notre table de manière à ce qu'elles soient triées.

Une séquence, par exemple une list, est triée par ordre croissant si pour chaque paire d'éléments successifs a et b, a <= b vaut True.

Une séquence est triée par ordre décroissant si pour chaque paire d'éléments successifs a et b, a >= b vaut True.

[1, 2, 3, 4, 5, 20, 30] # Triée par ordre croissant
[30, 20, 5, 0, -6, -8]    # Triée par ordre décroissant
[-2, 20, 3, 26, 39, 22] # Non triée 

Tri croissant avec Python

On verra dans une autre partie du cours comment implémenter nos propres tris, mais pour le moment, on va simplement utiliser les outils fournis par Python.

Pour trier une séquence, on peut utiliser la fonction sorted, qui renvoie une copie triée par ordre croissant de la séquence

triee = sorted([-2, 20, 3, 26, 39, 22])
print(triee)

affiche

[-2, 3, 20, 22, 26, 39]

Pour trier une list, on peut aussi utiliser la méthode sort du type list, qui trie directement la list par ordre croissant en exploitant sa mutabilité :

liste = [-2, 20, 3, 26, 39, 22]
liste.sort()
print(list)

affiche

[-2, 3, 20, 22, 26, 39]

Tri décroissant avec Python

La méthode reverse du type list permet d'inverser l'ordre des éléments d'une list. En combinaison de la méthode sorted, elle permet d'effectuer un tri décroissant.

liste = [-2, 20, 3, 26, 39, 22]
liste.sort()
liste.reverse()
print(list)
affiche

[39, 26, 22, 20, 3, -2]

Tri d'une table

Si on essaie de trier une table, on risque d'avoir un problème : la méthode sort ne sait pas comment comparer les lignes de nos tables, qui sont des dict.

Il nous faut donc spécifier sur quelle colonne on veut que le tri ait lieu. Pour celà, on va utiliser le paramètre nommé key de la méthode sort. Il corresponds à une fonction qui prends en paramètre un élément de la liste, et retourne une valeur pour le "représenter" dans la comparaison. Par exemple, si on veut trier la table sur la population, on pourra passer lambda l : l["population"] en tant que key.

Voici ce que ça donne si on veut trier la table population par code postal :

population.sort(key=lambda l : l["code_postal"])

Exercice 11

Implémentez la fonction trier_population_decroissante, qui prends en paramètre une table de la forme de celle de population, et la trie par ordre décroissant de population.

En executant le programme correspondant de l'exercice, vous devriez obtenir la sortie suivante :

| code_insee | nom                      | code_postal | population |
| ---------- | ------------------------ | ----------- | ---------- |
| 31555      | Toulouse                 | 31200       | 479553     |
| 06088      | Nice                     | 06200       | 340017     |
| 44109      | Nantes                   | 44300       | 309346     |
| 34172      | Montpellier              | 34080       | 285121     |
| 67482      | Strasbourg               | 67200       | 280966     |
| 33063      | Bordeaux                 | 33100       | 254436     |
| 75115      | Paris 15e Arrondissement | 75015       | 233392     |
| 59350      | Lille                    | 59800       | 232787     |
| 35238      | Rennes                   | 35700       | 216815     |
| 75120      | Paris 20e Arrondissement | 75020       | 195814     |

Attention, la population dans la table est de type str, alors qu'on veut comparer des entiers

def trier_population_decroissante(population):
    population.sort(key=lambda l : int(l["population"]))
    population.reverse()

TODO (prof) reprendre ici