谁是最忙的门将?
下面是一个实用的 Python 脚本,用来统计足球比赛中各位门将的扑救次数,并找出"最忙"的门将。

完整脚本
import csv
from collections import defaultdict
def analyze_goalkeepers(csv_file):
"""统计门将扑救次数并排序"""
saves = defaultdict(int)
matches = defaultdict(int)
with open(csv_file, encoding='utf-8-sig') as f:
reader = csv.DictReader(f)
for row in reader:
keeper = row['门将'].strip()
count = int(row['扑救次数'])
saves[keeper] += count
matches[keeper] += 1
# 按总扑救次数降序排列
ranking = sorted(saves.items(), key=lambda x: x[1], reverse=True)
print(f"{'排名':<4}{'门将':<12}{'总扑救':<8}{'出场':<6}{'场均扑救':<10}")
print("-" * 44)
for i, (keeper, total) in enumerate(ranking, 1):
avg = total / matches[keeper]
print(f"{i:<4}{keeper:<12}{total:<8}{matches[keeper]:<6}{avg:<10.2f}")
busiest = ranking[0]
print(f"\n🔥 最忙的门将:{busiest[0]}(共 {busiest[1]} 次扑救)")
return ranking
if __name__ == '__main__':
analyze_goalkeepers('saves.csv')
示例数据 saves.csv
比赛,门将,扑救次数 第1轮,库尔图瓦,5 第1轮,奥布拉克,3 第2轮,库尔图瓦,7 第2轮,特尔施特根,4 第3轮,奥布拉克,6 第3轮,库尔图瓦,2 第4轮,特尔施特根,8
运行结果
排名 门将 总扑救 出场 场均扑救
--------------------------------------------
1 库尔图瓦 14 3 4.67
2 特尔施特根 12 2 6.00
3 奥布拉克 9 2 4.50
🔥 最忙的门将:库尔图瓦(共 14 次扑救)
关键设计说明
| 设计点 | 说明 |
|---|---|
defaultdict(int) |
避免 KeyError,累加逻辑简洁 |
utf-8-sig |
兼容 Excel 导出的带 BOM 的 CSV |
.strip() |
防止门将名字前后有空格导致分组错误 |
| 场均扑救 | 比总扑救更能反映"忙不忙",出场少的门将不会被冤枉 |
reverse=True |
降序排列,最忙的排最前 |
扩展建议
- 真实数据源:可以换成调用 FBref 或 API-Football 的接口抓取数据,而非手动 CSV。
- 多维度"忙":除了扑救次数,还可加入"被射正次数""禁区外射门被扑"等指标,用加权评分判断谁压力最大。
- 可视化:用
matplotlib画柱状图更直观:
import matplotlib.pyplot as plt
names = [k for k, _ in ranking]
counts = [v for _, v in ranking]
plt.bar(names, counts, color='steelblue')
plt.ylabel('总扑救次数')'门将扑救次数排行')
plt.show()
需要我把它改成直接从某个数据源(如 Excel 或多个 CSV 合并)读取,或者加上按球队/联赛筛选的功能吗?
版权声明:本站文章为原创整理,转载请注明出处。