¿Cómo ordenar un diccionario por valor (DESC) y luego por clave (ASC)?

Justo después de descubrir el asombroso sorted() , me quedé atascado de nuevo.

El problema es que tengo un diccionario de la string(key) : integer(value) formulario string(key) : integer(value) y necesito clasificarlo en orden descendente de sus valores enteros, pero si dos elementos tienen el mismo valor, entonces por orden ascendente de clave.

Un ejemplo para hacerlo más claro:

 d = {'banana':3, 'orange':5, 'apple':5} out: [('apple', 5), ('orange', 5), ('banana', 3)] 

Después de investigar un poco llegué a algo como:

 sorted(d.items(), key=operator.itemgetter(1,0), reverse=True) out: [('orange', 5), ('apple', 5), ('banana', 3)] 

Esto se debe a que es ordenación inversa tanto del valor como de la clave. Necesito la llave para ser revertido.

    Algo como

     In [1]: d = {'banana': 3, 'orange': 5, 'apple': 5} In [2]: sorted(d.items(), key=lambda x: (-x[1], x[0])) Out[2]: [('apple', 5), ('orange', 5), ('banana', 3)] 
    • Los diccionarios no se pueden ordenar directamente, por lo que debe ordenar los elementos () , la lista de tuplas que contienen pares clave / valor.

    • Ya que desea ordenar por el campo de valor, entonces los campos de clave, es necesario extraerlos de la tupla para usarlos como clave de clasificación usando operator.itemgetter que obtiene el campo especificado.

    • Por último, para clasificar descendiendo en un campo y descendiendo en otro, haga dos pases, primero clasificando por la tecla secundaria ascendente, y luego otra pase clasificando por la clave primaria descendiendo. Este paso se basa en la estabilidad de tipo Python.

    Por ejemplo:

     import operator In [1]: d = {'banana': 3, 'orange': 5, 'apple': 5} In [2]: fruit = sorted(d.items(), key=operator.itemgetter(0)) In [3]: sorted(fruit, key=operator.itemgetter(1), reverse=True) Out[3]: [('apple', 5), ('orange', 5), ('banana', 3)] 

    Consulte la guía de ordenación de Python para obtener más detalles.