Ранжирование значений в словаре (и правильная обработка 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}