Trier les données d'un dictionnaire

D'après une photo de kazuend sur Unsplash
Lorsque l'on trie des données, on a rarement une liste à trier. La plupart du temps, les données que nous avons sont des données complexes. Prenons par exemple le cas suivant. Nous avons le résultat d'une course à pied. Les données sont stockées dans un dictionnaire. Les clefs du dictionnaire sont les numéros de dossard et les valeurs sont des tuples contenant le nom du coureur et son temps. Un extrait du dictionnaire serait le suivant :
resultats = {
1: ('Jean', 12.5),
2: ('Paul', 11.5),
3: ('Marie', 13.5),
4: ('Luc', 10.5),
5: ('Anne', 14.5),
...
}
L'organisateur souhaite afficher les résultats par ordre croissant de temps. Pour cela, il doit trier
les résultats. Pour commencer, afin de pouvoir trier les résultats,
nous pouvons utiliser la méthode items()
qui permet
d'itérer sur le dictionnaire en récupérant à la fois les clefs et les valeurs.
Cela nous permettra de faire une liste de tuples à partir des données du dictionnaire.
liste_resultats = []
for cle, valeur in resultats.items():
liste_resultats.append((cle, valeur))
La liste obtenue à partir de notre dictionnaire exemple sera :
liste_resultats = [(1, ('Jean', 12.5)),
(2, ('Paul', 11.5)),
(3, ('Marie', 13.5)),
(4, ('Luc', 10.5)),
(5, ('Anne', 14.5)),
...]
Nous allons pouvoir maintenant trier notre liste de tuples.
Pour cela, nous allons utiliser un de nos algorithmes de tri.
Pour illustrer, nous utiliserons le tri sélection. Le critère
de tri sera le temps, c'est à dire le deuxième élément du second
tuple, soit liste[j][1][1]
.
def tri_selection_performance(liste):
for i in range(len(liste)):
# Position du minimum
min_index = i
for j in range(i+1, len(liste)):
# On range en fonction du temps
if liste[j][1][1] < liste[min_index][1][1]:
min_index = j
# On échange les éléments
liste[i], liste[min_index] = liste[min_index], liste[i]
tri_selection_performance(liste_resultats)
Après le tri, notre liste de tuples sera :
liste_resultats = [(4, ('Luc', 10.5)),
(2, ('Paul', 11.5)),
(1, ('Jean', 12.5)),
(3, ('Marie', 13.5)),
(5, ('Anne', 14.5)),
...]
Nous avons maintenant une liste triée. Il ne reste plus qu'à afficher les résultats.
compteur = 1
for resultat in liste_resultats:
print(f"{compteur} - dossart n° {resultat[0]} - {resultat[1][0]} : {resultat[1][1]}")
compteur += 1
L'affichage des résultats sera :
1 - dossart n° 4 - Luc : 10.5
2 - dossart n° 2 - Paul : 11.5
...
Remarque
Vous savez sans doute déjà que Python propose une méthode pour trier les données,
d'un tableau : sort()
.
Il existe aussi une fonction
sorted()
qui construit une liste triée
à partir d'un itérable (liste, tuple, dictionnaire,etc.).