基于Python编写一个自动评分系统
作者:IT小本本
前言
前天朋友找我帮忙。
他们单位要举办一个年初 演讲比赛。
流程很常见:
- 5 位评委打分
- 去掉一个最高分
- 去掉一个最低分
- 计算平均分
- 每组选出第一名
听起来很简单。
但真正执行的时候,事情就变了。
负责人给我看了他们的 Excel。
80 个选手 5 个评委 400 个评分数据
他们的统计方式是:
- Excel 录入分数
- 手动找最高分
- 手动找最低分
- 写公式算平均
- 再按组排序
- 找第一名
负责人说:“昨天统计成绩统计到晚上 11 点。”
我看了一眼 Excel,说了一句话:
“这事 Python 10 秒就能做完。”
excel数据样例:

一、比赛评分的经典规则
很多比赛都会用这个规则:
去掉最高分 + 去掉最低分 + 求平均
举个例子。
选手 张三 的评分:98 83 96 83 61
排序之后:61 83 83 96 98
去掉:
- 最低分 61
- 最高分 98
剩下:83 83 96
平均分:87.333
这就是最终成绩。
二、如果用 Excel 手动算
如果只有 10 个选手:
问题不大。
但如果是:
- 80 个选手
- 5 个评委
- 400 个分数
你需要:
- 删除最高最低
- 写公式
- 排序
- 找每组第一名
不仅慢,而且 非常容易算错。
这也是为什么很多比赛 统计成绩要一两个小时。
三、Python 解决方案
其实只需要 30 行 Python。
核心代码:
import pandas as pd
df = pd.read_excel("20260310.xlsx")
score_cols = ["得分1","得分2","得分3","得分4","得分5"]
def calc_valid_score(row):
scores = sorted(row[score_cols])
valid_scores = scores[1:-1]
return sum(valid_scores)/len(valid_scores)
df["最高有效分"] = df.apply(calc_valid_score,axis=1)
这行代码:
scores[1:-1]
直接完成:
去最高分 + 去最低分
四、自动选出每组第一名
Python 的 Pandas 有一个很强的功能:
groupby
配合:
idxmax
代码:
result = df.loc[df.groupby("组别")["最高有效分"].idxmax(),
["姓名","组别","最高有效分"]]
结果:

整个计算过程:
不到 1 秒。
五、再升级:自动排名
只要再加两行代码:
df["组内排名"] = df.groupby("组别")["最高有效分"].rank(ascending=False)
df["总排名"] = df["最高有效分"].rank(ascending=False)
自动生成:
| 姓名 | 组别 | 得分1 | 得分2 | 得分3 | 得分4 | 得分5 | 最高有效分 | 组内排名 | 总排名 |
|---|---|---|---|---|---|---|---|---|---|
| 张三 | A组 | 71 | 72 | 73 | 74 | 81 | 73 | 3 | 9 |
| 李四 | B组 | 60 | 64 | 85 | 69 | 96 | 72.66666667 | 3 | 10 |
| 王麦子 | C组 | 82 | 66 | 75 | 63 | 67 | 69.33333333 | 4 | 15 |
| 赵六 | D组 | 93 | 68 | 75 | 83 | 95 | 83.66666667 | 1 | 4 |
| 马七 | A组 | 66 | 67 | 68 | 69 | 70 | 68 | 4 | 17.5 |
| 杨八 | B组 | 76 | 66 | 71 | 93 | 65 | 71 | 4 | 12.5 |
| 候机 | C组 | 87 | 85 | 71 | 61 | 98 | 81 | 2 | 5 |
| 吉士 | D组 | 99 | 63 | 69 | 65 | 71 | 68.33333333 | 5 | 16 |
| 洪七公 | A组 | 93 | 94 | 95 | 96 | 97 | 95 | 2 | 2 |
| 张三三1 | B组 | 83 | 77 | 75 | 79 | 89 | 79.66666667 | 1 | 6 |
| 张三三2 | C组 | 68 | 67 | 64 | 78 | 95 | 71 | 3 | 12.5 |
| 张三三3 | D组 | 88 | 98 | 72 | 64 | 67 | 75.66666667 | 2 | 8 |
| 张三三4 | A组 | 63 | 64 | 65 | 66 | 67 | 65 | 5 | 20 |
| 张三三5 | B组 | 74 | 62 | 65 | 62 | 93 | 67 | 5 | 19 |
| 张三三6 | C组 | 93 | 79 | 86 | 89 | 93 | 89.33333333 | 1 | 3 |
| 张三三7 | D组 | 84 | 63 | 68 | 61 | 92 | 71.66666667 | 3 | 11 |
| 张三三8 | A组 | 98 | 99 | 100 | 100 | 99 | 99.33333333 | 1 | 1 |
| 张三三9 | B组 | 78 | 62 | 83 | 90 | 71 | 77.33333333 | 2 | 7 |
| 张三三10 | C组 | 74 | 67 | 63 | 62 | 92 | 68 | 5 | 17.5 |
| 张三三11 | D组 | 66 | 86 | 70 | 74 | 65 | 70 | 4 | 14 |
所有成绩:
自动计算。
六、一键生成成绩单
再加一行代码:
df.to_excel("比赛成绩统计.xlsx",index=False)
Python 会自动生成:
完整成绩表 + 排名表
评委只需要:
- 填 Excel
- 运行脚本
成绩就出来了。
七、现实中很多单位还在手算
其实很多地方:
比赛评分 考核评分 评委评分
仍然是:
Excel + 人工统计
但只要写一个 Python 脚本:
以后所有比赛都可以复用。
换一个 Excel 文件就能重新计算。
八、全部实现源代码
1、基础版全部代码:
import pandas as pd
# 1. 读取 Excel
df = pd.read_excel("20260310.xlsx")
# 2. 计算最高有效分(去掉一个最大和最小)
score_cols = ["得分1", "得分2", "得分3", "得分4", "得分5"]
def calc_valid_score(row):
scores = sorted(row[score_cols])
valid_scores = scores[1:-1] # 去掉最大和最小
return sum(valid_scores) / len(valid_scores)
df["最高有效分"] = df.apply(calc_valid_score, axis=1)
# 3. 每个组取最高有效分
result = df.loc[df.groupby("组别")["最高有效分"].idxmax(), ["姓名", "组别", "最高有效分"]]
# 4. 保留三位小数
result["最高有效分"] = result["最高有效分"].round(3)
# 5. 输出结果
print(result)2、升级版全部代码:
import pandas as pd
df = pd.read_excel("20260310.xlsx")
score_cols = ["得分1","得分2","得分3","得分4","得分5"]
def calc_valid_score(row):
scores = sorted(row[score_cols])
valid_scores = scores[1:-1]
return sum(valid_scores)/len(valid_scores)
df["最高有效分"] = df.apply(calc_valid_score,axis=1)
df["组内排名"] = df.groupby("组别")["最高有效分"].rank(ascending=False)
df["总排名"] = df["最高有效分"].rank(ascending=False)
df.to_excel("比赛成绩统计.xlsx",index=False)
print("成绩统计完成")最后
很多人学 Python 的时候都会问:
“Python 能干嘛?”
其实答案很简单。
只要是:
- 重复的
- 机械的
- 需要计算的
几乎都可以:
自动化。
当你第一次写出一个脚本,
替代 2 小时人工工作 的时候,
你就会真正理解一句话:编程最大的价值 不是写代码,而是 节省时间。
到此这篇关于基于Python编写一个自动评分系统的文章就介绍到这了,更多相关Python自动评分系统内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
