飞道的博客

新高考(3+1+2)的十二种选科情况下,四个再选科目的考室安排的探索

517人阅读  评论(0)

新高考十二种选科情况下,再选科目的考室安排的探索1.0版

新高考实施以来,本地实施的是3+1+2的模式,学生共有十二种选科方式。在组织考试时,利用excel进行按科目排序,接着随机排位,再确定考室号和座位号的,最后输出一科的考试安排,这样的操作要进行九次,非常的浪费时间,而且是每个月一次的频率。为了从繁琐的重复劳动中解脱出来,我在被‘life is short,u need python!'的诱惑下,学习起如何把这个过程自动化。

任务分析:

1、现有 excel表1包括的列为:id 姓名 行政班归属 教学班 采用志愿 等,共1000+行
2、现有 excel表1包括的列为:考室名 容量 地址 等
3、需要得到一个总表,列为:id 姓名 行政班归属 考室号码 座位号码 考室科目
4、设计程序把这个总表,按照 行政班级相同的条件 生成各行政班级的详细信息表。

先来个1.0版,能实现基础功能的框架。

  1. 把excel表1和excel表2分别读取为 两个DataFrame:data 和 room
def get_df(path1):
    path11 = path1.split('\\')     #相对本py文件所在文件夹的路径,当前为同文件夹
    try: 
        data = pd.read_excel(path1)
    except:
        print('请把本py文件和数据源放在同一文件夹内,再次尝试。数据源的文件名为:姓名-行政班级归属-教学班-采用志愿.xlsx')
        data = pd.read_excel(path11[-1])
    return data```
    path1 = 'F:\操作区\考试学生座位安排\姓名-行政班级归属-教学班-采用志愿.xlsx'
    path3 = 'F:\操作区\考试学生座位安排\考场容量表.xlsx'
    df = get_df(path1)
	room = get_df(path3)
 2. 假如先安排  地理 科考试。那就要把 选了地理的 学生数据都拿出来放到df1里,没选地理的放到另一个rest_df里 .
 分析df里的 采用志愿,发现他们是str类型的,这十二种:'物化生','物化地','物化政','物生政','物生地','物政地','化生史','化地史','化政史','生政史','生地史','政史地'
 用 sub1 in df1.采用志愿[i] 就表示这个学生 选择了sub1代表的科目。所以sub1是单个的汉字:化 生 政 地

def getready(df1,sub1): # df1全体数据 ,sub表示科目:化地,政地 四科当中的一种
name_sub1 = []
xclass_sub1 = []
for i in range(len(df1.采用志愿)):
if sub1 in df1.采用志愿[i] :
name_sub1.append(df1.姓名[i])
xclass_sub1.append(df1.行政班归属[i])
df_sub1 = pd.DataFrame({‘姓名’:name_sub1,‘行政班归属’:xclass_sub1})
print(‘这里是考室科目为:{} 的考生样表\n’.format(sub1),df_sub1[0:1])
return df_sub1

这里遇到了一串的警告,我连忙检查我的dataframe 发现没有问题,先不管这么多了,没有功能性错误就先搞定大方向问题,之后有时间再来处理这里。【问题1】
这个函数的最有意思的是可以加一个 逻辑词not就可以 改为不选 sub1 代表的科目的学生信息表。

def getrest(df1,sub1): # df1 是一个数据表 ,sub表示科目:物化地,政史地 六科当中的一种
name_sub1 = []
xclass_sub1 = []
for i in range(len(df1.采用志愿)):
if sub1 not in df1.采用志愿[i] :
name_sub1.append(df1.姓名[i])
xclass_sub1.append(df1.行政班归属[i])
df_sub1 = pd.DataFrame({‘姓名’:name_sub1,‘行政班归属’:xclass_sub1})
print(‘这里是科目为:{} 的自习安排样表\n’.format(sub1),df_sub1[0:1])
return df_sub1


 3. 随机排列学生。
 这里经历了一些思考和磨难,一开始我想这是学生的行为,那么我们把考室考号作为 物品 分配个每个学生。学生随机从考室号里拿一个,再从这个考室里拿一个座位号。这个想法让要循环的次数太多,我的AMD E2笔记本每检测一次代码的错误都要耗时30多秒。一天后我还没能完善好这个想法就直接放弃了,又想了个办法。把考室号座位号 分发给学生,却总是卡死在同一个考室考号有多人的情况。
 啰嗦了这么多,直接上最终解决方式。df.take(list) 函数让我看到了希望,take函数接收一个list作为排序的依据,只要这个这个list是随机的就可以让df也随机起来。show u code:

sampler = np.random.permutation(len(temp_df)) #产生一个随机数列 df = temp_df.take(sampler) #DataFrame 采用 随机数列排序

4.把考生放到考室里和安排座位
   这里就不再随机放到考室了,用上一步的随机过程 ,这一步自然就随机了。

def randomsort(room,temp_df):
result_df = temp_df[0:1]
##随机把 temp_df 按照一个序列排序
sampler = np.random.permutation(len(temp_df)) #产生一个随机数列
temp_df = temp_df.take(sampler) #DataFrame 采用 随机数列排序
sumall =0
for i in range(len(room.容量)):
sumall = sumall + room.容量[i]
kao_num = []
if sumall <len(temp_df):
for j in range(room.容量[i]):
kaohao = sub1+str(i+1).rjust(2,‘0’)+str(j+1).rjust(2,‘0’)
kao_num.append(kaohao)
#??一次从temp_df中取出 room.容量[i] 行 作为第i个考室的考生
print(’{}第{}考室,共计{}人’.format(sub1,i+1,room.容量[i]),end=’ ‘)
room_df = temp_df[(sumall-room.容量[i]):sumall]
room_df[‘考号’] = kao_num #kao_num要和考室人数一致即 room.容量[i]
#path_save = ‘{}第{}考室’.format(sub1,i+1)+’.xlsx’
#room_df.to_excel(path_save,index=’’)
result_df = pd.concat([result_df, room_df])
print(’||’,end=’ ‘)
else:
#temp_df的最后几个 作为 第 i个考室的考生
for j in range(len(temp_df)-(sumall-room.容量[i])):
kaohao = sub1+str(i+1).rjust(2,‘0’)+str(j+1).rjust(2,‘0’)
kao_num.append(kaohao)
print(’{}第{}考室,共计{}人’.format(sub1,i+1,len(temp_df)-(sumall-room.容量[i])),end=’ ‘)
room_df = temp_df[(sumall-room.容量[i]):len(temp_df)]
room_df[‘考号’] = kao_num #kao_num要和考室人数一致即 room.容量[i]
#path_save = ‘{}第{}考室’.format(sub1,i+1)+’.xlsx’
#room_df.to_excel(path_save,index=’’) ,join_axes=[df5.index]
result_df = pd.concat([result_df, room_df])
print(’||’,end=’ ')
break
#result_df.drop(labels=0,inplace=True)
return result_df,i+1,kao_num[-1]

这里有个不足之处:
result_df = temp_df[0:1]
这句的目的是在循环里,把一个个考室的学生信息添加到这个df里
result_df = pd.concat([result_df, room_df])     【问题2】
下面这段是生成一个考室号和座位号的4位字段,1考室11号是011
11考室1号是1101
 for j in range(room.容量[i]):
                kaohao = sub1+str(i+1).rjust(2,'0')+str(j+1).rjust(2,'0')
                kao_num.append(kaohao)
 这段是从百度上搜的,感谢 诸葛老刘 [这里学到的](https://blog.csdn.net/weixin_39791387/article/details/82665958)

还有一个没有解决的疑问:
result_df.drop(labels=0,inplace=True)
这句 在另一段里不起作用,总是多一行,要手动删除。

4.最后1.0版时我没能把所有的安排放到一个df里。。
path_save = '{}第{}考室'.format(sub1,i+1)+'.xlsx'
        room_df.to_excel(path_save)
我把每个科目每个考室的安排都生成了一个文件,点一下那个酸爽就是一文件夹的文件,贼富有。

转载:https://blog.csdn.net/weixin_41879894/article/details/104776405
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场