假设我的内容如下所示:
leaderboard = {"James": 4, "Tom": 2, "Tim": 8, "Jim": 2}
我如何获得每个名字的排名,以便具有相同分数的人具有相同的排名?
Tim: 1
James: 2
Tom: 3
Jim: 3
答案 0 :(得分:2)
只是按值对项目进行排序,循环遍历它们并仅在值严格小于前一个值时才增加排名。
答案 1 :(得分:2)
你正在寻找从名称反对映射:排名到排名:名称。 https://stackoverflow.com/a/485368/183948有你的答案。
inv_map = {}
for k, v in leaderboard.items():
inv_map[v] = inv_map.get(v, [])
inv_map[v].append(k)
在此之后,您可以对此inv_map的值进行排序,以获得您要查找的内容。
答案 2 :(得分:0)
您可以使用内置排序函数以及lambda函数来按值而不是字典键对字典进行排序。然后我们可以简单地通过for循环来分配排名。这段代码可能没有优化,但它可以工作,你可以找到如何优化你自己的for循环。排名的dict将保持人们的排名,如果你也愿意,你也可以把它列入一个列表。
sorted_by_value = sorted(learderboard, key = lambda x: leaderboard[x], reverse = True)
rank = 1
last_value = leaderboard[sorted_by_value[0]]
ranked_dict = dict()
for name in sorted_by_value:
this_value = leaderboard[name]
if this_value != last_value:
rank += 1
ranked_dict[name] = rank
last_value = this_value