2012-03-24 18 views
6

Necesito obtener una representación ordenada de un dict, ordenada en orden descendente de valores (el valor más grande en dict se mostrará primero).ordenando valores de python dict usando la función integrada ordenada

muestra:

mydict={u'jon':30,u'den':26,u'rob':42,u'jaime':31} 

necesito para mostrarles como

rob=42 
jaime=31 
jon=30 
den=28 

probé este

from operator import itemgetter 
sortedvalues=sorted(mydict,key=itemgetter(1)) 

Al imprimir la lista consigo

[u'jaime', u'den', u'rob', u'jon'] 

¡Esta lista no está ordenada! ¿Me falta algo sobre el uso de builtin ordenado? o estoy usando el itemgetter incorrectamente?

Respuesta

11

Este es un problema interesante porque usted no causó un error como usted tendría si las llaves eran de otro tipo no indexable (dice enteros), y esto se debe a una serie sutil de las cosas:

  1. ordenados (mydict, ...) trata de recorrer un diccionario utilizando el equivalente de iter(mydict) que llamar mydict.__iter__()
  2. iteración un diccionario da sus claves , en efecto iter(mydict) es la misma que mydict.iterkeys().
  3. Sus claves eran cadenas, y dado que las cadenas son indexables, itemgetter(1) trabajará en un valor de cadena, obteniendo el segundo carácter en la cadena.

El código que tenía habría fallado con un IndexError si alguna cadena tuviera también una longitud de 1 char, solo tuvo suerte. (o no lo hizo, dependiendo de cómo lo mires, dado que obtener el IndexError te habría hecho consciente del problema más pronto).)

Lo que se quiere hacer si sólo se desea que los valores es:

sorted(mydict.values(), reverse=True) 

Y si quieres las llaves así en parejas, que quieren

sorted(mydict.iteritems(), key=itemgetter(1), reverse=True) 
+1

me di cuenta de que justo antes de la lectura de esta respuesta! y cambiado a mydict.iteritems() .. agradece la ayuda –

+0

¿cuándo deberíamos usar dict.iteritems() sobre dict.items()? –

+1

Si solo desea las claves: 'ordenados (mydict, key = mydict.get, reverse = True)' –

5

Están ordenados por la segunda letra del nombre; iterar sobre un dict produce sus claves.

sorteditems = sorted(mydict.iteritems(), key=itemgetter(1)) 
3

iteración en un diccionario (que es lo que hace la función de sorted) le daremos solamente es teclas:

>>> sorted(mydict) 
[u'den', u'jaime', u'jon', u'rob'] 

En su lugar, desee ordenar las claves y valores - para hacer esto, se utiliza mydict.items() (o mydict.iteritems(), que es más eficiente con grandes dicts):

>>> sorted(mydict.items()) 
[(u'den', 26), (u'jaime', 31), (u'jon', 30), (u'rob', 42)] 

A continuación, el código podría funcionar como se esperaba:

>>> from operator import itemgetter 
>>> sorted(mydict.items(), key = itemgetter(1)) 
[(u'den', 26), (u'jon', 30), (u'jaime', 31), (u'rob', 42)] 

también es posible que desee ordenar con la clave de la dict como el valor de ordenación secundaria, en el caso de múltiples teclas tienen el mismo valor:

>>> mydict={u'a': 1, 'z': 1, 'd': 1} 
>>> sorted(mydict.items(), key = itemgetter(1)) 
[(u'a', 1), ('z', 1), ('d', 1)] 
>>> sorted(mydict.items(), key = itemgetter(1, 0)) 
[(u'a', 1), ('d', 1), ('z', 1)] 
Cuestiones relacionadas