You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用openpyxl实现F1车手逐站累计积分计算问题求助

问题解决:实现F1车手逐站累计积分统计

针对你的需求,我们需要修改代码逻辑,将单站积分替换为每站后的累计积分。核心思路是按赛事顺序遍历,实时更新每位车手的累计分数,并将每一站的累计结果存储下来,最终写入表格。

修改后的完整代码如下:

from openpyxl import load_workbook, Workbook

# 加载原始赛事数据
wb = load_workbook(filename='/kaggle/input/f1-results/f1-results.xlsx')

# 创建积分统计工作簿
standings_workbook = Workbook()
standings_sheet = standings_workbook.active
standings_sheet.title = 'Standings'

# 初始化两个字典:
# driver_total: 记录每位车手当前累计积分(初始为0)
# driver_standings: 记录每位车手每站后的累计积分结果
driver_total = {}
driver_standings = {}

# 按顺序遍历每一站赛事
for sheet_name in wb.sheetnames:
    race_sheet = wb[sheet_name]
    # 临时存储本站所有车手的单站积分
    race_points = {}
    
    # 提取本站车手的单站积分
    for row in range(2, race_sheet.max_row + 1):
        driver_name = race_sheet.cell(row=row, column=3).value
        points = race_sheet.cell(row=row, column=6).value
        # 处理空值,默认0分
        race_points[driver_name] = int(points) if points else 0
    
    # 更新所有车手的累计积分,并记录本站后的结果
    # 先处理本站参赛的车手
    for driver, pts in race_points.items():
        if driver not in driver_total:
            driver_total[driver] = 0
        driver_total[driver] += pts
        # 初始化车手的累计记录字典
        if driver not in driver_standings:
            driver_standings[driver] = {}
        driver_standings[driver][sheet_name] = driver_total[driver]
    
    # 处理本站未参赛的车手,保持之前的累计积分
    for driver in driver_total:
        if driver not in race_points:
            driver_standings[driver][sheet_name] = driver_total[driver]

# 写入表头:第一列是车手姓名,后续列是各赛事名称
standings_sheet.cell(row=1, column=1, value='车手姓名')
for col_idx, sheet_name in enumerate(wb.sheetnames, start=2):
    standings_sheet.cell(row=1, column=col_idx, value=f"{sheet_name}后累计")

# 写入每位车手的逐站累计积分
row_idx = 2
for driver, standings in driver_standings.items():
    standings_sheet.cell(row=row_idx, column=1, value=driver)
    for col_idx, sheet_name in enumerate(wb.sheetnames, start=2):
        # 确保即使车手后期才参赛,前面的赛事累计为0
        if sheet_name not in standings:
            standings_sheet.cell(row=row_idx, column=col_idx, value=0)
        else:
            standings_sheet.cell(row=row_idx, column=col_idx, value=standings[sheet_name])
    row_idx += 1

# 可选:添加总积分列(等于最后一站的累计积分)
total_col = len(wb.sheetnames) + 2
standings_sheet.cell(row=1, column=total_col, value='总积分')
for row_idx in range(2, standings_sheet.max_row + 1):
    final_standings = standings_sheet.cell(row=row_idx, column=total_col -1).value
    standings_sheet.cell(row=row_idx, column=total_col, value=final_standings)

# 保存结果
standings_workbook.save(filename='_driver_standings.xlsx')

关键修改说明:

  1. 数据存储结构调整:新增driver_total跟踪实时累计积分,driver_standings记录每站后的最终累计结果
  2. 逐站累计逻辑:遍历赛事时,先提取本站所有车手的单站积分,再更新累计值,确保每一站的结果是之前所有赛事的积分总和
  3. 未参赛车手处理:本站未参赛的车手,累计积分保持上一站的数值,避免出现空值
  4. 表头优化:将赛事表头改为[赛事名]后累计,更清晰表达列含义

内容的提问来源于stack exchange,提问作者m k

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:25:05