我有一种方法可以对从1开始递增的索引中的团队值进行排序。看起来像这样:
def create_ranking():
sort_one = sorted(team_scores.items(), key=itemgetter(0))
teams_sorted = sorted(sort_one, key=itemgetter(1), reverse=True)
for idx, (team, score) in enumerate(teams_sorted, 1):
suffix = 'pt' if score ==1 else 'pts'
print(f'{idx}. {team + ","} {score} {suffix}')
目前正在向我提供此输出:
1. Tarantulas, 6 pts
2. Lions, 5 pts
3. FC Awesome, 1 pt
4. Snakes, 1 pt
5. Grouches, 0 pts
当前,它是根据分数值对字典进行排序,如果分数相同,则会按字母顺序对其进行排序。
如果我需要显示在相同索引值上具有相同得分的团队,该如何对字典进行排序。例如:
1. Tarantulas, 6 pts
2. Lions, 5 pts
*3. FC Awesome, 1 pt
3. Snakes, 1 pt*
4. Grouches, 0 pts
答案 0 :(得分:3)
使用itertools.groupby
收集得分相同的团队,然后遍历每个组:
from operator import itemgetter
import itertools
sort_one = [
('Tarantulas', 6),
('Lions', 5),
('FC Awesome', 1),
('Snakes', 1),
('Grouches', 0),
]
teams_sorted = sorted(sort_one, key=itemgetter(1), reverse=True)
for idx, (score, group) in enumerate(itertools.groupby(teams_sorted, itemgetter(1)), 1):
for team, ignore_score in group:
suffix = 'pt' if score ==1 else 'pts'
print('{idx}. {team}, {score} {suffix}'.format(idx=idx, team=team, score=score, suffix=suffix))
答案 1 :(得分:1)
作为itertools.groupby()
的替代方法,只有当当前分数不等于上次看到的分数时,才可以增加位置计数器:
>>> from operator import itemgetter
...
>>> team_scores = {
... 'Tarantulas': 6,
... 'Lions': 5,
... 'FC Awesome': 1,
... 'Snakes': 1,
... 'Grouches': 0
... }
...
>>> i, last = 0, -1
>>> for k, v in sorted(team_scores.items(), key=itemgetter(1), reverse=True):
... if v != last:
... i += 1
... last = v
... pts = 'pt' if v == 1 else 'pts'
... print(f'{i}. {k + ","} {v} {pts}')
...
1. Tarantulas, 6 pts
2. Lions, 5 pts
3. FC Awesome, 1 pt
3. Snakes, 1 pt
4. Grouches, 0 pts