基于条件聚合嵌套元组结果:推导式实现统计表格输出求助
解决嵌套元组的球队进球统计问题
首先我先梳理下你的需求:从给定的嵌套元组数据中,按球队统计三个指标——first(进球数<50的次数)、second(进球数≥50的次数)、totalgoals(总记录数),最终输出清晰的统计结果。
先看你的原始数据:
team = ((35, 'Team1'),(8, 'Team2'),(55, 'Team1'),(65, 'Team2'),(90, 'Team1'))
步骤1:用推导式按球队分组进球数据
第一步得先把不同球队的进球数据归类到一起,这里用字典推导式就能高效完成:
team_goals = {t: [g for g, team_name in team if team_name == t] for t in set(tn for g, tn in team)}
这段代码的逻辑是:
- 先通过
set(tn for g, tn in team)提取所有不重复的球队名称 - 再为每个球队筛选出对应的所有进球数,存入字典的对应键值对中
运行后team_goals的结果是:
{'Team1': [35, 55, 90], 'Team2': [8, 65]}
步骤2:用推导式计算各队统计指标
有了分组好的数据,接下来就能用列表推导式生成每个队的统计结果:
stats = [ (team_name, sum(1 for g in goals if g < 50), # first:进球<50的次数 sum(1 for g in goals if g >= 50), # second:进球≥50的次数 len(goals) # totalgoals:总记录数 ) for team_name, goals in team_goals.items() ]
这段推导式会为每个球队生成包含名称和三个统计值的元组,stats的结果是:
[('Team1', 1, 2, 3), ('Team2', 1, 1, 2)]
步骤3:输出目标格式的结果
如果想要清晰的表格格式,可以这样打印:
# 打印表头 print("first second totalgoals") # 逐行打印球队统计数据 for team_name, first, second, total in stats: print(f"{team_name:<8} {first:<8} {second:<12} {total}")
输出效果:
first second totalgoals Team1 1 2 3 Team2 1 1 2
如果想要你示例里的紧凑格式,就用这段代码:
# 紧凑格式输出 print("first second totalgoals", end=" ") for team_name, first, second, total in stats: print(f"{team_name} {first} {second} {total}", end=" ")
输出效果:
first second totalgoals Team1 1 2 3 Team2 1 1 2
为啥之前的推导式没达到理想效果?
大概率是跳过了数据分组这关键一步,直接统计会难以区分不同球队的数据。先把数据按队归类,再针对每组做统计,推导式就能清晰发挥作用啦。
内容的提问来源于stack exchange,提问作者Jorge Rebelo
相关产品推荐
相关产品推荐

