使用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')
关键修改说明:
- 数据存储结构调整:新增
driver_total跟踪实时累计积分,driver_standings记录每站后的最终累计结果 - 逐站累计逻辑:遍历赛事时,先提取本站所有车手的单站积分,再更新累计值,确保每一站的结果是之前所有赛事的积分总和
- 未参赛车手处理:本站未参赛的车手,累计积分保持上一站的数值,避免出现空值
- 表头优化:将赛事表头改为
[赛事名]后累计,更清晰表达列含义
内容的提问来源于stack exchange,提问作者m k
相关产品推荐
相关产品推荐

