python - 有没有办法枚举共享相同索引的列表或字典?
问题描述
我想枚举一个列表或字典,如果项目共享相同的值或相等,我希望它们使用 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)
推荐阅读
- azure - 使用逻辑应用程序部署 Arm 模板引发错误:数据接收器不能在同一资源的同一类别的不同设置中重复使用
- scala - 如何使用 Circe 为某种类型的列表半自动派生解码器?
- javascript - 为什么我的点击事件不起作用?(ASP.NET MVC)
- android - 如何在 Android 中以编程方式启用 VoWiFi(WiFi 通话)?
- typescript - 如何根据 TypeScript 中其他属性的值声明属性类型
- javascript - 在 VueJS 中过滤 v-for 列表后,如果 Child 为空,则隐藏字符串
- javascript - Jest 测试用例失败 - ReferenceError: Office is not defined
- gwt - GWT JsInterop - 在 JavaScript 中扩展 Java 接口
- c# - 如何从与 C# 中的 UI 线程不同的线程访问 HttpContext.Request.Cookie?
- python-3.x - SyntaxError:if 语句时语法无效