Clasificación de valores en un diccionario (y el cuidado de ex-aequos correctamente)

Me gustaría clasificar los valores en un diccionario.

Por ejemplo, tengo este diccionario: {"A": 10, "B: 3, "C": 8, "D": 3, "E": 2} El resultado debe ser similar a: {"E": 1, "B": 2, "D": 2, "C": 4, "A": 5}

Tenga en cuenta que D está clasificado como cuarto porque B y D están empatados en la posición dos . Por lo tanto, no hay posición tres .

Ya se han dado soluciones similares en otros subprocesos, sin embargo, no tuvieron en cuenta las posiciones ex-aequo de la forma tradicional: agregar un rango a un dict en python y el rango de retorno del diccionario de clasificación de Python

Primero ordena los datos en orden ascendente según el número, como este

 >>> data = {"A": 10, "B": 3, "C": 8, "D": 3, "E": 2} >>> s_data = sorted(data.items(), key=lambda item: item[1]) >>> s_data [('E', 2), ('D', 3), ('B', 3), ('C', 8), ('A', 10)] 

Ahora, por cada elemento procesado,

  • si no es el mismo que el elemento anterior, entonces el rango debe incrementarse por el número de elementos similares procesados ​​hasta ahora

  • si es lo mismo, entonces simplemente cuenta el elemento actual como un elemento similar

Para implementar esto, inicialice algunas variables, como esta.

 >>> rank, count, previous, result = 0, 0, None, {} 

luego continúe verificando si el elemento actual no es igual al elemento anterior y si es verdadero, aumente el rank por el número de veces que ocurrieron los elementos similares.

 >>> for key, num in s_data: ... count += 1 ... if num != previous: ... rank += count ... previous = num ... count = 0 ... result[key] = rank 

Ahora, el result tendrá el resultado que querías.

 >>> result {'D': 2, 'C': 4, 'E': 1, 'B': 2, 'A': 5}