Ранжирование значений в словаре (и правильная обработка ex-aequos)

Я хотел бы ранжировать значения в словаре.

Например, у меня есть этот словарь: {"A": 10, "B: 3, "C": 8, "D": 3, "E": 2}Результат должен выглядеть так: {"E": 1, "B": 2, "D": 2, "C": 4, "A": 5}

Обратите внимание, что D занимает четвертое место, потому что B а также D связаны на второй позиции. Следовательно, нет позиции три.

Подобные решения уже были предоставлены в других потоках, однако они не учитывали позиции ex-aequo традиционным способом: добавление ранга к диктату в python и словарь рейтинга ранжирования Python.

1 ответ

Решение

Сначала отсортируйте данные в порядке возрастания на основе числа, как это

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

Теперь для каждого обработанного элемента

  • если он не совпадает с предыдущим элементом, то ранг должен быть увеличен на количество похожих элементов, обработанных до сих пор

  • если это то же самое, то просто посчитать текущий элемент как похожий элемент

Чтобы реализовать это, инициализируйте несколько переменных, как это

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

затем продолжайте проверять, не равен ли текущий элемент предыдущему элементу, и если он равен true, увеличивать rank по количеству раз, когда подобные элементы происходили.

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

Сейчас, result будет иметь результат, который вы хотели.

>>> result
{'D': 2, 'C': 4, 'E': 1, 'B': 2, 'A': 5}
Другие вопросы по тегам