Comment trier un dictionnaire par valeur en Python

Introduction

Un dictionnaire en Python est une collection d'éléments qui stocke des données sous forme de paires clé-valeur. Dans Python 3.7 et les versions ultérieures, les dictionnaires sont triés par ordre d'insertion des éléments. Dans les versions antérieures, ils n'étaient pas ordonnés.

Dans cet article, nous verrons comment trier un dictionnaire en fonction des valeurs qu'il contient.

Trier le dictionnaire à l'aide d'un en boucle

On peut trier un dictionnaire à l'aide d'un for boucle. Tout d'abord, nous utilisons le sorted() fonction pour ordonner les valeurs du dictionnaire. Nous parcourons ensuite les valeurs triées, en trouvant les clés pour chaque valeur. Nous ajoutons ces paires clé-valeur dans l'ordre trié dans un nouveau dictionnaire.

Remarque: Le tri ne vous permet pas de réorganiser le dictionnaire en place. Nous écrivons les paires ordonnées dans un tout nouveau dictionnaire vide.

dict1 = {1: 1, 2: 9, 3: 4}
sorted_values = sorted(dict1.values()) 
sorted_dict = {}

for i in sorted_values:
    for k in dict1.keys():
        if dict1[k] == i:
            sorted_dict[k] = dict1[k]

print(sorted_dict)

Si vous l'exécutez avec l'interpréteur Python, vous verrez :

{1: 1, 3: 4, 2: 9}

Maintenant que nous avons vu comment trier avec des boucles, regardons une alternative plus populaire qui utilise le sorted() la fonction.

Trier le dictionnaire à l'aide de trié () Fonction

Nous utilisions auparavant le sorted() fonction pour trier les valeurs d'un tableau. Lors du tri d'un dictionnaire, nous pouvons passer un argument de plus à la sorted() fonctionne comme ceci: sorted(dict1, key=dict1.get).

Ici, key est une fonction qui est appelée sur chaque élément avant que les valeurs ne soient comparées pour le tri. La get() La méthode sur les objets dictionnaire renvoie la valeur de la clé d'un dictionnaire.

La sorted(dict1, key=dict1.get) expression renverra la liste des clés dont les valeurs sont triées dans l'ordre. À partir de là, nous pouvons créer un nouveau dictionnaire trié :

dict1 = {1: 1, 2: 9, 3: 4}
sorted_dict = {}
sorted_keys = sorted(dict1, key=dict1.get)  

for w in sorted_keys:
    sorted_dict[w] = dict1[w]

print(sorted_dict) 

Le sorted() La fonction a réduit la quantité de code que nous devions écrire lors de l'utilisation for boucles. Cependant, nous pouvons encore combiner les sorted() fonction avec le itemgetter() fonction pour une solution plus succincte au tri des dictionnaires par valeurs.

Trier le dictionnaire à l'aide de opérateur modules et getter()

La operator le module comprend le itemgetter() fonction. Cette fonction renvoie un objet appelable qui renvoie un élément d'un objet.

Par exemple, utilisons itemgetter() pour créer un objet appelable qui renvoie la valeur de n'importe quel dictionnaire avec une clé qui est 2:

import operator

dict1 = {1: 1, 2: 9}
get_item_with_key_2 = operator.itemgetter(2)

print(get_item_with_key_2(dict1))  

Chaque dictionnaire a accès au items() méthode. Cette fonction renvoie les paires clé-valeur d'un dictionnaire sous la forme d'une liste de tuples. Nous pouvons trier la liste des tuples en utilisant le itemgetter() fonction pour extraire la deuxième valeur du tuple, c'est-à-dire la valeur des clés du dictionnaire.

Une fois trié, nous pouvons créer un dictionnaire basé sur ces valeurs :

import operator

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict) 

Avec beaucoup moins d'efforts, nous avons un dictionnaire trié par valeurs !

L' key accepte n'importe quelle fonction, nous pouvons utiliser les fonctions lambda pour renvoyer les valeurs du dictionnaire afin qu'elles puissent être triées. Voyons comment.

Trier le dictionnaire à l'aide d'une fonction Lambda

Les fonctions Lambda sont des fonctions anonymes ou sans nom en Python. Nous pouvons utiliser les fonctions lambda pour obtenir la valeur d'un élément du dictionnaire sans avoir à importer le operator module pour itemgetter(). Si vous souhaitez en savoir plus sur les lambdas, vous pouvez lire à leur sujet dans notre guide pour Fonctions Lambda en Python.

Consultez notre guide pratique et pratique pour apprendre Git, avec les meilleures pratiques, les normes acceptées par l'industrie et la feuille de triche incluse. Arrêtez de googler les commandes Git et en fait apprendre il!

Trions un dictionnaire par valeurs en utilisant une fonction lambda dans le key argument de la sorted():

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=lambda item: item[1])
print(sorted_tuples)  
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict)  

Notez que les méthodes dont nous avons parlé jusqu'à présent ne fonctionnent qu'avec Python 3.7 et versions ultérieures. Voyons ce que nous pouvons faire pour les versions antérieures de Python.

Renvoyer un nouveau dictionnaire avec des valeurs triées

Après avoir trié un dictionnaire par valeurs, pour conserver un dictionnaire trié dans les versions Python antérieures à 3.7, vous devez utiliser la OrderedDict – disponible dans le collections module. Ces objets sont des dictionnaires qui conservent l'ordre d'insertion.

Voici un exemple de tri et d'utilisation OrderedDict:

import operator
from collections import OrderedDict

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  

sorted_dict = OrderedDict()
for k, v in sorted_tuples:
    sorted_dict[k] = v

print(sorted_dict)  

Conclusion

Ce didacticiel a montré comment un dictionnaire peut être trié en fonction de ses valeurs. Nous avons d'abord trié un dictionnaire en utilisant deux boucles for. Nous avons ensuite amélioré notre tri en utilisant le sorted() fonction. Nous avons également vu le itemgetter() fonction du operator module peut rendre notre solution plus succincte.

Enfin, nous avons adapté notre solution pour fonctionner sur des versions Python inférieures à 3.7.

Variantes de la sorted() sont les plus populaires et les plus fiables pour trier un dictionnaire par valeurs.

Horodatage:

Plus de Stackabuse