用Python计算综合测评中的专业成绩加权平均分

时间:2024-05-20 16:35:48

一、引言

相信很多大学生朋友们都经历过综合测评。每次综合测评的时候都要计算班上同学成绩的加权平均分(或绩点),可能会有些学校会直接给出结果,然而有些学校并不会。这时就需要班上的负责人进行计算,这可是件比较麻烦的事情。这时我就想到,能不能用编程解决这类问题呢?

“为什么开学初进行的综合测评直到现在才发攻略呢??”

“因为懒。”

 

二、准备工作

由于作者学校的期末成绩是由Excel表给出的,所以在Python程序中需要对Excel表进行读写操作。这时我们需要导入两个包,一个是xlrd(用来读Excel),另一个是xlwt(用来写Excel)。

这两个包一般情况下来说不是自带的,需要自行下载安装,我是用pip安装的,比较方便。

接下来我们再来观察一下成绩单Excel表的特点(嘤嘤嘤 要暴露自己的成绩了):

用Python计算综合测评中的专业成绩加权平均分

(俗话说得好,世界上有10种程序员,一种是从0开始数数的,一种是从1开始数数的。为了编程讲解方便,我就做第0种程序员吧)

第0列学院名

第1列专业名

第2列班级名

第3列学生姓名

第4列学号

第5列学期数

第6列课程号

第7列课程名

第8列课程学分

第9列课程成绩

知道了每列的内容之后,我们可以开始干活了。

 

三、开始干活

整个过程大概分成三步:第一步,读取成绩信息;第二步,计算加权平均数结果;第三步,将结果存入新的Excel表中。

1. 读取成绩信息

首先我们打开成绩单的Excel表:

book = xlrd.open_workbook("/home/xu/学习/Python/综合测评/成绩单1.xlsx")
# 打开Excel文件
sheet1 = book.sheet_by_index(0)
 # 打开索引号为0的表 这个索引号就是打开Excel之后左下角的那个玩意的序号 并非名称

因为成绩是按照学生的姓名进行统计的,所以我使用Python中的字典数据类型来保存学生的成绩信息。格式如下:

stu[‘学生姓名’]=[[‘第0门课程学分’ , ’成绩’] , [‘第1门课程学分’ , ’成绩’] , ... , [‘第n门课程学分’ , ’成绩’]]

                                                                       用Python计算综合测评中的专业成绩加权平均分

接着我们逐行读取Excel表中的数据:

for i in range(sheet1.nrows):
    row = sheet1.row_values(i)
    if row[3] not in stu.keys():
        stu[row[3]] = [row[8:10]]
    else:
        stu[row[3]].append(row[8:10])

从第三行if判断语句可以看出代码的大致思路是每读取一行数据后,判断学生姓名是否已在字典的键名中。若未出现,则创建记录,若已出现,则直接append。

这里还有一种情况,有些学校计算加权平均分的时候不是所有选修的课程都计算在内的,而是只计算专业课的分数,而上述的代码显然没有考虑到这种情况。这时我们可以在第三行if条件判断语句之外再加上一个判断条件(意思就是原本的三到六行都要写在新的条件判断语句之内),判断该课程是需要算分,可以用一个list保存需要算分的科目的课程号,然后用in进行判断,易得。

(其实我是先用Excel自带的筛选功能先把专业课挑出来的(手动滑稽))

 

2. 计算加权平均数结果

for name in stu:
    credit = 0 # 总学分
    total = 0 # 学分乘成绩的和
    for x in stu[name]:
        credit += x[0]
        total += x[0]*x[1]
    stu_grade.append([name,total/credit])

stu_grade变量里存的就是学生的姓名和最后的加权平均分,格式如下:

stu_grade[i] = [‘第i个学生的姓名’ , ’加权平均分’]

在这里,有些学校计算的是学分,只要在第六行total += x[0]*x[1]之前加上条件判断就行了,易得。

 

3. 将结果存入新的Excel表中

和打开Excel表类似,不再赘述。

book = xlwt.Workbook(encoding = 'utf-8')
# 打开Excel文件
sheet = book.add_sheet("sheet1")
# 打开索引号为0的表 这个索引号就是打开Excel之后左下角的那个玩意的序号 并非名称

for i in range(len(stu_grade)): # 逐行写入
    sheet.write(i,0,stu_grade[i][0])
    sheet.write(i,1,stu_grade[i][1])

book.save("test.xls") # 保存

 

四、感想

1. 我当时给变量命名的时候命的是什么鬼名字。(代码是九月份就写好的,文章是刚写的,因为懒,所以代码也没改)

2. 我大三分数好低。

3. 我都大四了以后都用不到了想想还有点小失落呢。

 

附Python完整代码如下:

#coding:utf-8

import xlrd # 读excel
import xlwt # 写excel

book = xlrd.open_workbook("/home/xu/学习/Python/综合测评/成绩单1.xlsx")
sheet1 = book.sheet_by_index(0) # 打开索引号为0的表
stu = {}
stu_grade = []

# 读取学生姓名、每门课程的学分以及每门课程的成绩
for i in range(sheet1.nrows):
    row = sheet1.row_values(i) # 逐行读取
    #print(row)
    if row[3] not in stu.keys():
        stu[row[3]] = [row[8:10]]
    else:
        stu[row[3]].append(row[8:10])

# 计算加权平均数
for name in stu:
    credit = 0 # 总学分
    total = 0 # 学分乘成绩的和
    for x in stu[name]:
        credit += x[0]
        total += x[0]*x[1]
    stu_grade.append([name,total/credit])

# 写入新的excel表
book = xlwt.Workbook(encoding = 'utf-8')
sheet = book.add_sheet("sheet1")

for i in range(len(stu_grade)):
    sheet.write(i,0,stu_grade[i][0])
    sheet.write(i,1,stu_grade[i][1])

book.save("test.xls")

# print(stu_grade)