要求同一班的人员前后不相邻,python 写的分考场的程序,源数据 input.xlsx,在这个 Excel 文件中2个工作表 Sheet1 里是参考人员信息,有三列,姓名、班级、r值,Sheet2 里是考场信息,有三列,考场号、人数、考场位置。程序运行后会读取 input.xlsx 里的数据,自动分场,结果放在 output.xlsx 里。
# encoding=utf-8
# 考试分场程序,同一考场中相同班级同学前后不相临
import pandas as pd
import numpy as np
import sys
# 生成准考证号 年级2位 考场2位 考号2位
def gen(grade,number,index):
if(len(number)<2):
number="0"+number
if(len(index)<2):
index="0"+index
return str(grade) + number + index
# 检测 DataFrame 的数据班级列有没有连续重复
def check(df):
clss=df['班级'].tolist()
for i,j in enumerate(clss):
# 防止下标出错
try:
if clss[i]==clss[i+1]:
return False
except:
pass
return True
# place 考场位置 number 考场号
def arrange(df,place,number):
# 随机排序法
flag=False
while flag==False:
rnd=np.random.permutation(len(df))
df=df.take(rnd)
flag=check(df)
# 添加两列
df['考场位置']=place
df['考场号']=number
# 删除 r值列
del df['r值']
df=df.reset_index(drop=True)
#df['考号']=df.apply(lambda x: str(x[3]),axis=1)
df['考号']=df.apply(lambda x: gen(25,str(x[3]),str(x.name+1)),axis=1)
return df
# 递归求解法 检测第1行和第2行的班级列数据相同吗?相同,整个 DataFrame 随机排序,不同,从第2行截断 DataFrame, 对比后一段 DataFrame 的第1行和第2行,递归直到后一段数据长度为0。
# 顺序占位法 从 DataFrame 中向按行查找班级为1的数据行,复制到新的 DataFrame 中,index 为1,DataFrame 中删除这一行,接下来查找班级为2的,如果没有就找班级为3的,依次向下。
def subplot(input,output):
# Sheet1 读取学生信息 班级 姓名 r值
df1=pd.read_excel(input,sheet_name='Sheet1')
# Sheet2 读取考场信息 考场号 人数 考场位置
df2=pd.read_excel(input,sheet_name="Sheet2")
# 核对一下总人数与考场总座位数是否相同
cnt1=df1.shape[0]
cnt2=df2['人数'].sum()
if(cnt1!=cnt2):
sys.stderr.write("出错啦, Sheet1 里的人数和 Sheet2 里的人数不相符!\n")
raise SystemExit(1)
# 临时 DataFrame 容器
df3=pd.DataFrame()
numbers=df2['考场号'].tolist()
counts=df2['人数'].tolist()
places=df2['考场位置'].tolist()
# 起始位
start=0
for number,count,place in zip(numbers,counts,places):
# 分段的终止位
end=start+count
# 把每一场的数据提取出来
t=pd.DataFrame()
# 提取 start 到 end 行的所有列(按行提取数据)
t=df1.iloc[start:end,:]
# 排座次,防止同一班级连续重复,添加考场位置和考场号
t=arrange(t,place,number)
# 下一场的起始位
start=end+1
# 合并到一个 DataFrame 中
df3=pd.concat([df3,t])
df3=df3.loc[:,['考号','姓名','班级','考场位置','考场号']]
print(df3)
# 将临时 DataFrame 写入 excel 工作表中
excel = pd.ExcelWriter(output)
df3.to_excel(excel, sheet_name='Sheet1', index=False)
excel.close()
if __name__ == '__main__':
subplot("input.xlsx","output.xlsx")