2022-09-11 15:22 Temps de lecture : 13 min

Comment trier un dictionnaire Python par clé ou valeur

Dans ce guide, vous allez découvrir comment ordonner un dictionnaire Python, en utilisant soit ses clés, soit ses valeurs comme critère de tri.

Quand on manipule des dictionnaires en Python, il arrive souvent de devoir les organiser selon un ordre particulier, que ce soit en se basant sur les clés ou sur les valeurs. Étant donné qu'un dictionnaire Python est une collection de paires clé-valeur, l'objectif est de créer un nouveau dictionnaire où les clés ou les valeurs sont ordonnées selon nos besoins spécifiques.

Ce tutoriel débutera par un rappel des bases des dictionnaires en Python. Ensuite, nous verrons comment construire un nouveau dictionnaire dont le contenu est trié par clé ou par valeur, en fonction de la situation.

Révision des fondamentaux des dictionnaires Python

Qu'est-ce qu'un dictionnaire en Python ?

Un dictionnaire est une structure de données native de Python. Il enregistre des éléments sous forme de paires associant une clé à une valeur. On accède aux valeurs par l'intermédiaire de leurs clés. Étant donné que les clés permettent d'identifier les valeurs de manière unique, il est impératif qu'il n'y ait pas de clés dupliquées.

py_dict = {"Python":"génial!","Apprendre":True}
py_dict["Python"]
# Résultat : génial!

py_dict["Apprendre"]
# Résultat : True

Un dictionnaire a une fonction similaire à celle d'une table de hachage. Par conséquent, ce n'est pas une structure de données ordonnée par nature. L'accès aux éléments d'un dictionnaire se fait dans l'ordre qu'on souhaite, à condition que l'on connaisse les clés.

L'ordre des éléments dans un dictionnaire

Dans les versions antérieures de Python, pour maintenir l'ordre des clés, il était nécessaire d'utiliser OrderedDict. Cependant, depuis Python 3.7, les éléments sont conservés dans l'ordre d'ajout au dictionnaire.

Maintenant que les bases des dictionnaires en Python sont rafraîchies, voyons comment générer des copies triées de dictionnaires.

⚙️ Note : Pour que le code de ce tutoriel fonctionne comme prévu, il est impératif d'utiliser Python 3.7 ou une version plus récente. Vous avez la possibilité de télécharger la dernière version de Python ou encore de tester les exemples via l'éditeur Python en ligne de toptips.fr.

Trier un dictionnaire Python par clé

Imaginez la carte des desserts d'un café. Elle contient deux colonnes : les noms des articles et leurs prix.

On peut modéliser cela sous la forme d'un dictionnaire Python, où les noms des articles sont les clés et leurs prix, les valeurs.

Construisons ensemble le dictionnaire des desserts, comme indiqué ci-dessous.

desserts = {
    "Glace":10,
    "Brownies":12,
    "Cheesecake":3,
    "Roulé suisse":5,
    "Cookies":4,
    "Cupcake":2
}

À présent, créons un dictionnaire nommé sorted_desserts, où les desserts sont classés par ordre alphabétique. Dans le dictionnaire initial desserts, les noms des desserts correspondent aux clés. Il s'agit donc d'organiser ces clés par ordre alphabétique pour former un nouveau dictionnaire.

Comment récupérer les clés d'un dictionnaire Python

Pour commencer, nous devons extraire les clés du dictionnaire, puis les ordonner par ordre alphabétique.

En Python, la méthode intégrée .keys() permet de récupérer toutes les clés d'un dictionnaire sous forme de liste.

Utilisons la méthode .keys() sur le dictionnaire des desserts afin de récupérer les clés, comme montré ci-dessous.

keys = desserts.keys()
print(keys)

#Résultat
['Glace', 'Brownies', 'Cheesecake', 'Roulé suisse', 'Cookies',
'Cupcake']

La fonction intégrée sorted(), quand elle est appliquée à une liste, retourne une nouvelle liste triée.

Nous allons maintenant utiliser sorted() avec les clés de la liste comme argument, et mémoriser la liste triée dans la variable sorted_keys.

sorted_keys = sorted(keys)
print(sorted_keys)

# Résultat
['Brownies', 'Cheesecake', 'Cookies', 'Cupcake', 'Glace', 'Roulé suisse']

Maintenant que nous disposons des clés triées par ordre alphabétique, nous pouvons récupérer les valeurs correspondantes dans le dictionnaire desserts, comme indiqué ci-après.

sorted_desserts = {}
for key in sorted_keys:
  sorted_desserts[key] = desserts[key]

print(sorted_desserts)

# Résultat
{'Brownies': 12, 'Cheesecake': 3, 'Cookies': 4, 'Cupcake': 2,
'Glace': 10, 'Roulé suisse': 5}

Décortiquons le code ci-dessus :

  • Nous initialisons sorted_desserts en tant que dictionnaire Python vide.
  • Nous parcourons la liste de clés sorted_keys.
  • Pour chaque clé dans sorted_keys, on ajoute une entrée dans sorted_desserts en allant chercher la valeur associée dans le dictionnaire desserts.

L'usage de la boucle for de cette façon est considéré comme verbeux. Python propose une alternative plus succincte, en utilisant la compréhension de dictionnaire.

La compréhension de dictionnaire en Python

Python permet la compréhension de dictionnaire, similaire à la compréhension de liste. Cela permet de créer un nouveau dictionnaire Python en une seule ligne de code.

▶️ Voici la structure générale pour exploiter la compréhension de dictionnaire en Python.

# 1. Quand on a des clés et valeurs dans deux listes : list1, list2
new_dict = {key:value for key,value in zip(list1,list2)}

# 2. Quand on a les clés, et qu'on peut trouver les valeurs
new_dict = {key:value for key in <iterable>}

Utilisons la deuxième forme indiquée ci-dessus : new_dict = {key:value for key in } pour construire un dictionnaire sorted_desserts.

Dans cet exemple :

  • itérable : la liste sorted_keys
  • key : la clé à laquelle on accède en itérant à travers sorted_keys
  • value : on récupère la valeur liée à la clé dans le dictionnaire desserts, via desserts[key]

En rassemblant tout cela, on obtient l'expression de la compréhension de dictionnaire, comme affiché ci-dessous.

sorted_desserts = {key:desserts[key] for key in sorted_keys}
print(sorted_desserts)

{'Brownies': 12, 'Cheesecake': 3, 'Cookies': 4, 'Cupcake': 2,
'Glace': 10, 'Roulé suisse': 5}

Comme on le voit, les desserts sont classés par ordre alphabétique dans le dictionnaire sorted_desserts.

Comment trier un dictionnaire Python par valeur

Nous allons maintenant apprendre à trier un dictionnaire Python en utilisant ses valeurs.

Dans le dictionnaire des desserts, les valeurs correspondent aux prix. Il est donc possible de trier le dictionnaire par prix, soit par ordre croissant, soit décroissant.

▶️ On peut obtenir l'ensemble des paires clé-valeur en utilisant la méthode intégrée .items(). Chaque tuple représente une paire clé-valeur.

desserts.items()

dict_items([('Glace', 10), ('Brownies', 12), ('Cheesecake', 3),
('Roulé suisse', 5), ('Cookies', 4), ('Cupcake', 2)])

Chaque élément est un tuple en lui-même. Il est donc possible d'indexer chaque paire clé-valeur afin d'accéder aux clés et aux valeurs séparément.

dict_items = desserts.items()
for item in dict_items:
  print(f"clé:{item[0]},valeur:{item[1]}")

# Résultat
clé:Glace,valeur:10
clé:Brownies,valeur:12
clé:Cheesecake,valeur:3
clé:Roulé suisse,valeur:5
clé:Cookies,valeur:4
clé:Cupcake,valeur:2

Comme nous souhaitons trier par valeurs, on utilisera la méthode ci-dessus pour obtenir la valeur à l'index 1 dans la paire clé-valeur.

Comment trier les valeurs d'un dictionnaire Python par ordre croissant

Cette fois, nous utiliserons la fonction sorted() avec le paramètre optionnel key. Ce dernier peut être n'importe quelle fonction Python, une fonction intégrée, une fonction définie par l'utilisateur ou même une fonction lambda.

Note : lambda args : expression est la syntaxe de définition des fonctions lambda en Python.

Dans cet exemple de tri des desserts par prix, nous avons accès aux éléments du dictionnaire (couples clé-valeur). Nous allons définir key = lambda item:item[1] car nous voulons trier en fonction de la valeur (prix).

Comme la fonction sorted() retourne une liste par défaut, il est nécessaire de la convertir explicitement en dict, comme ci-dessous.

sorted_desserts = dict(sorted(desserts.items(), key=lambda item:item[1]))
print(sorted_desserts)

{'Cupcake': 2, 'Cheesecake': 3, 'Cookies': 4, 'Roulé suisse': 5,
'Glace': 10, 'Brownies': 12}

On peut aussi réécrire en utilisant la compréhension de dictionnaire, comme vu précédemment.

sorted_desserts = {key:value for key, value in sorted(desserts.items(),
key=lambda item:item[1])}

print(sorted_desserts)

# Résultat
{'Cupcake': 2, 'Cheesecake': 3, 'Cookies': 4, 'Roulé suisse': 5,
'Glace': 10, 'Brownies': 12}

Dans sorted_desserts, le Cupcake à 2 $ est le premier élément, et le Brownies à 12 $ est le dernier.

Comment trier les valeurs d'un dictionnaire Python par ordre décroissant

Pour trier par ordre décroissant des prix, vous pouvez affecter True au paramètre optionnel reverse, comme expliqué ci-dessous.

sorted_desserts = dict(sorted(desserts.items(), key=lambda item:item[1],
reverse=True))
print(sorted_desserts)

# Résultat
{'Brownies': 12, 'Glace': 10, 'Roulé suisse': 5, 'Cookies': 4,
'Cheesecake': 3, 'Cupcake': 2}

À présent, sorted_desserts est trié par ordre décroissant des prix, en commençant par le dessert le plus cher, le Brownies à 12 $.

Conclusion 👩🏽‍💻

Récapitulons brièvement tout ce que nous avons appris dans ce tutoriel.

  • Un dictionnaire Python enregistre les données sous forme de paires clé-valeur ; les clés doivent être uniques.
  • Lorsque l'on trie un dictionnaire, que ce soit par clé ou par valeur, on génère un nouveau dictionnaire qui est organisé selon nos besoins.
  • Les méthodes .keys() et .items() permettent de récupérer respectivement l'ensemble des clés et des paires clé-valeur d'un dictionnaire.
  • La fonction sorted(), avec les paramètres optionnels key et reverse, permet d'obtenir le tri souhaité.

Vous savez désormais comment trier un dictionnaire Python ; à présent, apprenez à trier des listes en Python. Bon codage ! 🎉

Auteur
France

Rédacteur tech, guides pratiques et astuces numériques.