44 votes

Tri d'un dictionnaire par valeur puis par clé

Il semble qu'il s'agisse d'un double, mais mon talent de recherche de SO est faible aujourd'hui...

Disons que j'ai un dictionnaire de clés/valeurs entières, comment puis-je trier le dictionnaire par les valeurs en ordre décroissant, puis par la clé en ordre décroissant (pour les valeurs communes).

Entrée :

{12:2, 9:1,  14:2}
{100:1, 90:4, 99:3, 92:1, 101:1}

Sortie :

[(14,2), (12,2), (9,1)]  # output from print 
[(90,4), (99,3), (101,1), (100,1), (92,1)]

78voto

unutbu Points 222216
In [62]: y={100:1, 90:4, 99:3, 92:1, 101:1}
In [63]: sorted(y.items(), key=lambda x: (x[1],x[0]), reverse=True)
Out[63]: [(90, 4), (99, 3), (101, 1), (100, 1), (92, 1)]

El key=lambda x: (x[1],x[0]) dit à sorted que pour chaque élément x en y.items() utiliser (x[1],x[0]) comme la valeur proxy à trier. Puisque x est de la forme (key,value) , (x[1],x[0]) donne (value,key) . Cela entraîne sorted pour trier par value d'abord, puis par key pour départager les ex-aequo.

reverse=True dit à sorted pour présenter le résultat par ordre décroissant, plutôt que par ordre croissant.

Voir ceci page du wiki pour un excellent tutoriel sur le tri en Python.

PS. J'ai essayé d'utiliser key=reversed à la place, mais reversed(x) renvoie un itérateur, qui n'effectue pas la comparaison nécessaire ici.

2voto

Don Points 5574

C'est peut-être plus explicite :

>>> y = {100:1, 90:4, 99:3, 92:1, 101:1}
>>> reverse_comparison = lambda (a1, a2), (b1, b2):cmp((b2, b1), (a2, a1))
>>> sorted(y.items(), cmp=reverse_comparison)
[(90, 4), (99, 3), (101, 1), (100, 1), (92, 1)]

0voto

Melug Points 665

Essayez ça :

>>> d={100:1, 90:4, 99:3, 92:1, 101:1}
>>> sorted(d.items(), lambda a,b:b[1]-a[1] or a[0]-b[0])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X