Ordenar un diccionario por valor y luego por clave

Esto parece que tiene que ser una trampa, pero mi búsqueda de SO es pobre hoy …

Digamos que tengo un diccionario de clave / valores enteros, ¿cómo puedo ordenar el diccionario por los valores descendentes y luego por la clave descendente (para valores comunes)?

Entrada:

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

Salida:

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

 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)] 

La key=lambda x: (x[1],x[0]) indica que para cada elemento x en y.items() , use (x[1],x[0]) como el valor proxy a clasificar . Como x es de la forma (key,value) , (x[1],x[0]) produce (value,key) . Esto hace que la sorted clasifique por value primero, luego por key para desempates.

reverse=True indica sorted para presentar el resultado en orden descendente, en lugar de en orden ascendente.

Vea esta página wiki para un gran tutorial sobre cómo ordenar en Python.

PD. Intenté usar key=reversed lugar, pero reversed(x) devuelve un iterador, que no se compara aquí como es necesario.

Tal vez esto sea más explícito:

 >>> 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)] 

Prueba esto:

 >>> 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])