首页 > 解决方案 > 有没有办法枚举共享相同索引的列表或字典?

问题描述

我想枚举一个列表或字典,如果项目共享相同的值或相等,我希望它们使用 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

标签: pythonpython-3.xlistsortingdictionary

解决方案


您可以使用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)


推荐阅读