Добавление звания к диктату в питоне
Предположим, у меня есть что-то вроде содержания:
leaderboard = {"James": 4, "Tom": 2, "Tim": 8, "Jim": 2}
Как мне получить ранг для каждого имени, чтобы люди с одинаковыми баллами имели одинаковый ранг?
Tim: 1
James: 2
Tom: 3
Jim: 3
3 ответа
Вы смотрите на инвертирование отображения из имен: рангов в ряды: имен. /questions/21593175/python-obratnyij-invertirovat-otobrazhenie/21593191#21593191 содержит ваш ответ.
inv_map = {}
for k, v in leaderboard.items():
inv_map[v] = inv_map.get(v, [])
inv_map[v].append(k)
После этого вы можете отсортировать значения этого inv_map, чтобы получить то, что вы ищете.
Просто отсортируйте элементы по значению, зацикливайте их и увеличивайте ранг, только если значение строго меньше предыдущего.
Вы можете использовать встроенную сортированную функцию, а также лямбда-функцию для сортировки словаря по значению вместо ключа словаря. Затем мы можем просто пройти через цикл for для назначения рангов. Этот код, вероятно, не оптимизирован, но он работает, вы можете узнать, как оптимизировать цикл for самостоятельно. Ранжированный диктат будет занимать звание народа, вы также можете внести это в список, если хотите.
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