Tri d'un dictionnaire par valeur puis clé

je peux Trier par clé ou valeur, mais j'ai besoin de trier par valeur, puis clé, en une ligne. Pour mieux expliquer cela, je peux vous montrer mon problème:

dict = {'apple': 2, 'banana': 3, 'almond':2 , 'beetroot': 3, 'peach': 4}

je veux que ma sortie soit triée en descendant par leur valeur puis en montant (A-Z) par leur clé (alphabétique). Résultant en une telle liste:

avec la sortie de: ['peach', 'banana', 'beetroot', 'almond', 'apple']

La seule façon que je sais comment le faire jusqu'à présent est:

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (v,k))]

avec la sortie de: ['almond', 'apple', 'banana', 'beetroot', 'peach']

ainsi il a trié les valeurs dans l'ordre croissant et les clés Alphabétiquement dans l'ordre croissant (A-Z). Donc si je inverse ceci:

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (v,k), reverse=True)]

avec la sortie de: ['peach', 'beetroot', 'banana', 'apple', 'almond']

il a trié les valeurs dans l'ordre décroissant et les clés Alphabétiquement dans l'ordre décroissant (Z-a).

y a-t-il un moyen de trier les valeurs en ordre décroissant et les touches dans l'ordre croissant (i.e. A-Z) et obtenir la sortie que j'ai montré ci-dessus?

21
demandé sur Martijn Pieters 2012-03-29 09:03:58

3 réponses

vous devez profiter du fait que les valeurs sont des nombres.

>>> [v[0] for v in sorted(d.iteritems(), key=lambda(k, v): (-v, k))]
['peach', 'banana', 'beetroot', 'almond', 'apple']
36
répondu Ignacio Vazquez-Abrams 2012-03-29 05:07:45

Trier par valeur descendante est, pour les quantités négatives, Trier par valeur négative ascendante.

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (-v,k))]
5
répondu Karl Knechtel 2012-03-29 05:09:20
>>> d = {'apple':2, 'banana':3, 'almond':2, 'beetroot':3, 'peach':4}
>>> [k for k, v in sorted(d.iteritems(), key=lambda(k, v): (-v, k))]
['peach', 'banana', 'beetroot', 'almond', 'apple']
1
répondu jamylak 2012-07-27 02:24:23