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