python 自动分考场程序同班不重复不连排

要求同一班的人员前后不相邻,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")
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值