在字典中对值进行排名(并正确处理 ex-aequos)

Ranking values in a Dictionary (and taking care of ex-aequos correctly)

我想对字典中的值进行排序。

例如,我有这本字典:{"A": 10, "B: 3, "C": 8, "D": 3, "E": 2} 结果应如下所示:{"E": 1, "B": 2, "D": 2, "C": 4, "A": 5}

请注意 D 排在 第四位 因为 BD 并列在 two。因此,没有位置 three.

类似的解决方案已经在其他线程中给出,但是他们没有以传统方式考虑ex-aequo位置:Adding a rank to a dict in python and Python Ranking Dictionary Return Rank

首先将数据按照编号从小到大排序,像这样

>>> 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, {}

然后继续检查当前元素是否不等于前一个元素,如果为真,则将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}