Trier les données d'un dictionnaire

les dictionnaires

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.).