有没有办法枚举共享相同索引的列表或字典



我想枚举一个列表或字典,如果项目共享相同的值或相等,我希望它们使用 1 个索引。

这是我的代码:

def print_data(league_results):
    for i, (team, points) in 
    enumerate(sorted(league_results.items(), key=lambda x: x[1], 
    reverse=True), 1):
        if points == 1:
          i = i
        print('{}. {}, {}'.format(i, team.strip(''), points))

输出

1. Man City, 6
2. Liverpool, 5
3. Everton, 1
4. Stoke, 1
5. Fulham, 0

这是我想要的输出:如果一个团队共享一个点,他们应该有相同的索引。埃弗顿和斯托克城必须共享相同的指数。

1. Man City, 6
2. Liverpool, 5
3. Everton, 1 
3. Stoke, 1
4. Fulham, 0
您可以使用

itertools.groupby

def print_data(league_results):
    grouped_results = itertools.groupby(
        sorted(league_results.items(), key=lambda x: x[1], reverse=True), 
        key=lambda x: x[1]
    )
    for i, (_, teams) in enumerate(grouped_results, 1):
        for team, points in teams:
            print('{}. {}, {}'.format(i, team.strip(''), points))

结果:

1. Man City, 6
2. Liverpool, 5
3. Everton, 1
3. Stoke, 1
4. Fulham, 0

这里有活生生的例子

解释:

groupby 将在点数和团队之间匹配一个可迭代对象(如果它们被排序,它将对它们进行分组(,从而为我们提供(points, [(team, points), ...]), ...的可迭代对象。因此,在枚举它时,您将枚举此组,这将是我们的索引i。由于我们希望枚举从1而不是0开始,因此我们只需要求函数从它开始enumerate(iterable, start_enumerate_value)

最新更新