python实现学生座位表排表

最近一位当老师的朋友说能不能整个学生座位表的软件,每次手动排太烦了,于是他说了需求:
1.男生和男生坐在一起,女生和女生坐在一起,成绩好坏随机排
2.总共九列七排,(其实规定9列之后排数不重要,依次往后续上就可以了)
基于这两个要求还是很好实现的,就随手给他整了一个,主要还是用的xlwt和xlrd这两个库来处理xls表格,感觉写的匆忙,很多优化的方便都没来得及处理,欢迎大家随时指正,下面展示一下代码片部分,供参考

filepath=os.path.abspath(os.curdir)  #获取当前文件的目录
def readfile(file):
    work_book = xlrd.open_workbook(file)   #打开工作表(学生信息表)
    sheet_1 = work_book.sheets()[0]            #打开表格1
    # print(sheet_1)
    col_num = int(sheet_1.ncols)              #获取学生表的列数和行数
    row_num = int(sheet_1.nrows)
    name_list_m = []  	#男生姓名列表
    name_list_w = []		#女生姓名列表
    # sex=sheet_1.cell_value(1,1)
    # print(sex)
    #注意此处默认文件第一行为属性值:姓名,性别等等
    for i in range(row_num):
        if i == 0:
            continue
        sex = sheet_1.cell_value(i, 1)                #这里因为表格固定第二列为性别,所以讲列数写死
        name = sheet_1.cell_value(i, 0)            #获取当前学生姓名
        if sex == 0:    #如果性别男,则放入一组等待排序,0表示男性,1表示女性
            name_list_m.append(name)     
        else:           #女生放入一组等待排序                            
            name_list_w.append(name)
    lenm = len(name_list_m)   #男生总人数
    lenw = len(name_list_w)    #女生总人数

上面的片段即实现了将表格男女生分开,放入列表中,下面就是讲男女生分组了,三人一小组,每一排三个小组

	new_m = []     #先新建两个列表,代表参与分组的学生
    new_w = []
    for i in range(int(lenm / 3)):			#对男生进行分配,每三人一组
        a = random.sample(name_list_m, 3)    # 这里是对男生列表进行随机不重复取3个值,并放入新的列表中
        new_m.append(a)     #将参与分组的学生移除之前的列表,这样剩下的学生就是未能参与分组的
        for j in range(len(a)):
            name_list_m.remove(a[j])
    for i in range(int(lenw / 3)):
        a = random.sample(name_list_w, 3)
        new_w.append(a)
        for j in range(len(a)):
            name_list_w.remove(a[j])
    alllist = new_w + new_m      #男女生总的分组列表合在一起

至此第一部分结束,将男女生分组 分别已经随机排序,下面将男女组随机排列写入新的表格中

	f = xlwt.Workbook()
    sheet_2 = f.add_sheet("座位表0", cell_overwrite_ok=False)#新建座位表
    #sheet_3 = f.add_sheet("座位表", cell_overwrite_ok=False)
    # 这里对之前男女生列表进行随机排列并加入新列表里
    lenall = len(alllist)
    new_all = []
    for i in range(lenall):
        list0 = random.sample(alllist, 1)  #在总的分组中随机取出一组加入新列表,同时在原列表中移除
        new_all.append(list0[0])
        alllist.remove(list0[0])
    print(new_all)   #新的随机分组
    list_name = []   #这里将分组完毕的学生全都依次排列
    for i in range(lenall):                #获取分组总长度
        for j in range(len(new_all[i])):   #获取分组中每一个小的分组长度
            list_name.append(new_all[i][j])  #取出每一个对应的学生名
    print(len(list_name))   #参与分组总人数
    # 将之前未能拼成三人一组的学生加入列表
    if name_list_w==[]:
        pass
    else:
        for i in range(len(name_list_w)):
            list_name.append(name_list_w[i])
    if name_list_m==[]:
        pass
    else:
        for i in range(len(name_list_m)):
            list_name.append(name_list_m[i])

最后将数据写入表格:

it = iter(list_name)     #这里用了生成器函数,用next()一次取出每一个值
    len0 = len(list_name)
    while True:
        try:
            for i in range(int(len0 / 9 + 1)):
                for j in range(9):
                    sheet_2.write(i, j, next(it))
                    # sheet_3.write(i, j, next(it))
        except StopIteration:
            break
    f.save(file)

之后看一下运行效果和实践效果,代码已打包
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值