如何在python中对字典索引进行排序

时间:2018-09-06 15:05:02

标签: python python-3.x

我有一种方法可以对从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

2 个答案:

答案 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