Python: Trier le contenu d'un dictionnaire (dict)
En python, l'objet dict ne conserve pas l'ordre dans lequel les éléments sont ajoutés et ne possède pas de fonction sort permettant de trier les données suivants les clés ou les valeurs.
Pour trier un objet dict, il suffit d'utiliser la fonction sorted.
Cette fonction retourne une liste contenant les valeurs triées.
Dans le cas d'un objet dict, les données (clés + valeurs) sont converties en tuple.
Exemple:
>>> d1 = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'a1': 5, 'b1': 10, 'c1': 8, 'd1': 6}
>>> print(d1)
{'d1': 6, 'c': 3, 'd': 4, 'b': 2, 'a1': 5, 'c1': 8, 'b1': 10, 'a': 1}
On voit que l'ordre d'insertion n'a pas été conservé.
Tri de l'objet dict en fonction des clés
>>> sorted(d1.items(), key=lambda t: t[0])
[('a', 1), ('a1', 5), ('b', 2), ('b1', 10), ('c', 3), ('c1', 8), ('d', 4), ('d1', 6)]
On utilise donc la fonction sorted avec en paramètre la liste des données (clé + valeurs) de l'objet dict (la fonction items() de l'objet dict) et en clé de tri, une fonction lambda indiquant l'indice à utiliser pour le tri.
L'indice '0' (zéro) indique la clé de l'objet dict.
Pour un tri suivant les valeurs, il suffit d'indiquer l'indice '1' (un)
>>> sorted(d1.items(), key=lambda t: t[1])
[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('a1', 5), ('d1', 6), ('c1', 8), ('b1', 10)]
Si les valeurs sont des tuples ou des lists, il suffit d'indiquer, un second indice (x), correspondant à la position sur laquelle on souhaite faire le tri.
>>> sorted(d1.items(), key=lambda t: t[1][x])
Pour conserver l'ordre de tri dans un objet dict, il est obligatoire d'utiliser l'objet OrderedDict du module collections.
>>> from collections import OrderedDict
>>> d2 = OrderedDict(sorted(d1.items(), key=lambda t: t[0]))
>>> print(d2)
OrderedDict([('a', 1), ('a1', 5), ('b', 2), ('b1', 10), ('c', 3), ('c1', 8), ('d', 4), ('d1', 6)])
L'itération d'un objet OrderedDict s'utilise de la même manière que pour un objet dict.
>>> for k, v in d2.items():
print("{:>3s} : {:<d}".format(k, v))
a : 1
a1 : 5
b : 2
b1 : 10
c : 3
c1 : 8
d : 4
d1 : 6
Testé avec Python2 et Python3
Commentaires
Saltz (non vérifié)
sam, 30/03/2019 - 21:22
Permalien
Bonjour ,
Bonjour ,
En gros , trier un dico revient à le transformer en liste contenant des tuples si j'aie bien compris .
ronan
dim, 31/03/2019 - 23:50
Permalien
Tout à fait
Mais le but premier d'un objet dict est d'indexer des valeurs à l'aide de clés.
Le tri est utiliser seulement pour l'affichage. Ca n'a pas vraiment d'importance.
jean (non vérifié)
jeu, 04/08/2022 - 15:57
Permalien
question de tri
Bonjour,
c’est complet mais je ne trouve pas la réponse à mon problème… Snif
J’ai un dictionnaire dont les clés ont pour valeur une liste contenant des tuples et je souhaite trier les tuples de chaque liste en fonction du premier terme du tuple qui est un « float ».
dic ={ ‘yo’:[(2,’oui’,’mardi’),(4,’pas’,’mercredi’),(1,’non’,’lundi’)],….}
ici je voudrais avoir (1,’non’,’lundi’),(2,’oui’,’mardi’),(4,’pas’,’mercredi’)
ronan
jeu, 04/08/2022 - 22:29
Permalien
Bonjour Jean
Pour ton problème, je procéderais de cette manière:
>>> dic ={ 'yo':[(2,'oui','mardi'),(4,'pas','mercredi'),(1,'non','lundi')]}
>>> for k, v in dic.items():
... dic[k] = sorted(v, key=lambda x: x[0])
...
...
>>> dic
{'yo': [(1, 'non', 'lundi'), (2, 'oui', 'mardi'), (4, 'pas', 'mercredi')]}
>>>
Ajouter un commentaire