La forma más Pythonic hacerlo sería saber un poco más sobre los datos reales - en concreto, el valor máximo que puede tienen - y luego hacerlo de esta manera:
def sortkey((k, v)):
return (maxval - v, k)
items = thedict.items()
items.sort(key=sortkey)
pero a menos que ya conoce el valor máximo, buscando el valor máximo significa bucle a través de la dict un tiempo extra (con max(thedict.itervalues())
), que puede ser costoso. De forma alternativa, una versión de la solución de keyfunc S. Lott:
def sortkey((k, v)):
return (-v, k)
items = thedict.items()
items.sort(key=sortkey)
Una alternativa que no se preocupa por los tipos sería una función de comparación:
def sortcmp((ak, av), (bk, bv)):
# compare values 'in reverse'
r = cmp(bv, av)
if not r:
# and then keys normally
r = cmp(ak, bk)
return r
items = thedict.items()
items.sort(cmp=sortcmp)
y esta solución realmente funciona para cualquier tipo de clave y valor con los que desea mezclar la ordenación ascendente y descendente con la misma clave. Si el valor de la brevedad se puede escribir como sortcmp:
def sortcmp((ak, av), (bk, bv)):
return cmp((bk, av), (ak, bv))
Véase mi respuesta a una pregunta relacionada [aquí] (http://stackoverflow.com/questions/1143671/python-sorting-list-of- dictionaries-by-multiple-keys/1144405). – hughdbrown