【办公类-16-02】“2022上学期 大班运动场地分配表1-跳过节日循环排序”(python 排班表系列)

本文讲述了在复工复学后,如何使用Python解决8个班级运动场地每周循环排列的问题,尤其是考虑到节假日需要跳过的复杂情况。作者首先尝试了简单的每周五天的循环方法,但被组长否决,之后理解了组长希望确保每个班级都能平均使用所有场地的需求。经过改进,作者编写了一个能跳过节假日的程序,生成了每个班级的运动场地排序表,显著提高了工作效率。尽管仍需手动调整涉及节日的部分,但已大大减少了人工错误和工作量。
摘要由CSDN通过智能技术生成

样例展示:跳过节日的运动场地循环排序表(8个班级8组内容)

背景需求:

复工复学后,周计划做起来!每周的运动场地安排照旧……

存在问题(一):

8个大班,靠着人工排序,每周都要推算一次这个规则,推演麻烦,且容易出错

(1)每周都要打开前一周教案看写到哪一个场地,

(2)同时还要打开"运动.docx"复制里面的文字, 

(3)小心复制:"运动.docx"的文字需要特别选中,删除前面的数字.再黏贴到本周教案的指定位置

(4)错误率多,不少班主任说很容易复制错误内容,但不会去复查,将错就错了.(做资料)

解决方案(第一次:五个一组排列):

于是我利用代码跑了一份每周五天的代码

 存在问题:

我兴高采烈发送到班组群,组长却提出异议,并要求大家还是用人工排序方法在周计划里逐条黏贴场地.

学过Python后,我再也不想做人工排序了。通过沟通,我们终于理解对方的意思:

 (1)本人意图:用程序给每周排五个场地(顺序),但根据实际工作日黏贴轮到的场地,如9月1日排到“04跑步”,前面的星期一到星期三的内容01爬笼 02球类 03平衡就删除。

  (2)组长意图:9月1日是起始日,就要用第01场地,日后也要跳过节假日,进行顺序排列。

优缺点分析:

1、本人方法,可能会出现节假日那天排到的场地,就自然跳过了,孩子们没有玩到。(运动技能不平衡)

2.因此组长的排序方法(跳过节假日)更合理,确保了每个班级,对于每个场地的平均实用效率大致相等。

 解决策略(第二次:跳过节假日的场地排序)

于是经过了整整三天的修改,本人终于打通所有的难点,获得了想要的程序。

为了方便理解,8个运动场地内容用缩写(数字+运动场地简写),便于大家理解数字的变化。

运行视频:

20220922大班运动场地排序(跳过节日)

重要步骤说明:

第1步:制作8个班的“”场地基础组“(大1班从01开始,大2班从02开始)并循环

第2步:如果需要每周固定排5天,就用这代码(后面的跳日期的代码就隐藏)

第3步:本项目需要跳过节日,如第1周只有2天,第3周周一中秋节跳过等。就用这代码(前面的5日循环代码就隐藏)

 这是原来测试“跳过假日”的代码,可以删除

 第4步:写入excle里面的 第1行“”星期“”、第1列“”第X周“”  B2列插二位数组 第5步:保存8个单个xls,并合并到一个工作簿中(8个工作表)

 运行代码:

import sys
import random
import xlrd
import xlwt
from openpyxl import load_workbook
import time
print('---------运动场地的循环------')
print('---------规则:------')
print('---------1.有8个运动场地,01 02 03 04 05 06 07 08:------')
print('---------2.大1班从01开始游戏,01 02 03 04 05 06 07 08:------')
print('---------3.大2班从02开始游戏,02 03 04 05 06 07 08,01 ------')
print('---------4.大3班从03开始游戏,03 04 05 06 07 08,01 02 ------')
print('---------依次类推,最后制作出所有大班的每周的运动排序表 ------')
print('---------通常是每周5天,需要跳过节假日 ------')
time.sleep(2)


print('---------第1步:把8个运动场地循环21次(105元素组成的列表)------')

# 本学期:大1,大2,大3,大4,大5,大7,大8,大9班,其中6班空缺,一共有8个大班
gradenum=['1','2','3','4','5','7','8','9']
# print(len(gradenum))# 8

# radenum的长度=7,0-7,一共循环8次
for num in range(0,len(gradenum)):

    L=[]# 这里的L等于list,因为和最后excle合并程序中的代码有冲突,所以全部改成大写的首字母
    L1=[]
    L3=[]  
    L2=[]
    # 这里是8个运动场地,因为后面有递进,所以把最后一个 08,放到01前面,这样摆放后面才会正确)
    L3=['08车类','01爬笼','02球类','03平衡', '04跑步','05障碍','06投掷','07山洞']

    # 生成8个班级8组运动(第1个元素不同)
    for i in range(0,len(gradenum)):        # 
        b = L3.pop(0)    # 在运动场地列表L3中 删除 第1个元素 大1班 先删除08,就是从01开始
        L3.append(b)  # 在运动场地列表L3最后 添加 第1个元素
        # print(L[0])
        L1.append(L3[0:len(gradenum)])     # 把不断变化的内容添加到L1 
        # 8个班级场地“基本元素“构成了L1列表:[['01', '02', '03', '04', '05', '06', '07', '08'], ['02', '03', '04', '05', '06', '07', '08', '01'], ['03', '04', '05', '06', '07', '08', '01', '02'], ['04', '05', '06', '07', '08', '01', '02', '03'], ['05', '06',  
    # print(L1)

    for b in range(22):        # 把各班“场地基本元素8个”循环21次,数量多一点,便于后期提取内容
        for y in L1[num]:    #抽取L1中的一组组内容  L1[0]=['01', '02', '03', '04', '05', '06', '07', '08']、L1[1]=['02', '03', '04', '05', '06', '07', '08', '01'],
            # print(y)               # 在用 y提取L1[0]中的'01', '02', '03', '04', '05', '06', '07', '08'三个元素
            L.append(y)     #把y提取的单个元素一个个加到列表里,并且依次循环22次,数量足够多
    print(L)
    # 打印出来大1班 列表组=['01', '02', '03', '04', '05', '06', '07', '08','01', '02', '03', '04', '05', '06', '07', '08','01', '02', '03', '04', '05', '06', '07', '08','01', '02', '03', '04', '05', '06', '07', '08','01', '02', '03', '04', '05', '06', '07', '08']


    print('---------第2步:如果一周有5天(不考虑跳过假日)------')
#   
    # print('大{}班'.format(gradenum[num]))

    # for i in range(1):#共20周这是第1周,是原始的位置81234
    #     print(L[0:5]) # 列表有8个运动项目,但只要其中5个(周一到周五)
    #     L2.append(L[0:5])
    # for i in range(2,22):  #共20周    这是第2-20周  ,如果是21周,把2,21 改成2,22 
    #     L=L[5:]  #  5代表前面一个数已经取过5位
    #     L.append(L) # 将a安排到最后一个座位
    #     print(L[0:5]) # 列表是八个循环,我只要其中5个
    #     L2.append(L[0:5])  

#  

    print('---------第3步:如果每周需要跳过假日(考虑跳过假日)------')
    
    #  每周需要的天数 (跳过节日.如第1周只有2天工作,9月1-2日(周四周五) ,第3周周一是中秋节放假1天,所以只有4个工作日)
    day=['2','5','4','5','5','2','5','5','5','5','5','5','5','5','5','5','5','4','5','5','2']

    print('大{}班'.format(gradenum[num]))
    # 第1周
    for d in range(0,1):          # d=索引数字
        print(L[0:int(day[0])]) # 列表有8个运动项目,但只要其中5个(周一到周五)
        L2.append(L[0:int(day[0])]) 
    # 第2周开始
    for d in range(1,len(day)):        # 0-21
        # print(d+1)
        L=L[int(day[d-1]):]  # day[0]=2,
        L.append(L) # 将a安排到最后一个座位
        print(L[0:int(day[d])])# 列表是八个循环,我只要其中5个
        L2.append(L[0:int(day[d])])

    # 以下是跳过假日的最初的写法,太长了,研究上面的是2022.9.9-2023.1.17 共21周的假日安排
    # 第1周2天
    # L2=[]# 取空列表
    # for i in range(1,2):#共20周这是第1周,是原始的位置81234
    #     L1=L
    #     print(L[0:2]) # 列表有8个运动项目,但只要其中5个(周一到周五)
    #     L2.append(L[0:2])

    # # 第2周5天
    # for i in range(2,3):  #共20周    这是第2-20周  ,如果是21周,把2,21 改成2,22 
    #     L1=L[0] # 获取第一个a
    #     L=L[2:]  #  a暂时离开,后面的号码都进一位。
    #     L.append(L1) # 将a安排到最后一个座位
    #     print(L[0:5]) # 列表是八个循环,我只要其中5个
    #     L2.append(L[0:5])  

    # # 第3周4天
    # for i in range(3,4):  #共20周    这是第2-20周  ,如果是21周,把2,21 改成2,22 
    #     L1=L[0] # 获取第一个a
    #     L=L[5:]  #  a暂时离开,后面的号码都进一位。
    #     L.append(L1) # 将a安排到最后一个座位
    #     print(L[0:4]) # 列表是八个循环,我只要其中5个
    #     L2.append(L[0:4])  

    # # 第4周5天
    # for i in range(4,5):  #共20周    这是第2-20周  ,如果是21周,把2,21 改成2,22 
    #     L1=L[0] # 获取第一个a
    #     L=L[4:]  #  a暂时离开,后面的号码都进一位。
    #     L.append(L1) # 将a安排到最后一个座位
    #     print(L[0:5]) # 列表是八个循环,我只要其中5个
    #     L2.append(L[0:5])  

    # # 第5周5天
    # for i in range(5,6):  #共20周    这是第2-20周  ,如果是21周,把2,21 改成2,22 
    #     L1=L[1] # 获取第一个a
    #     L=L[5:]  #  a暂时离开,后面的号码都进一位。
    #     L.append(L1) # 将a安排到最后一个座位
    #     print(L[0:5]) # 列表是八个循环,我只要其中5个
    #     L2.append(L[0:5])  

    # # 第6周5天
    # for i in range(6,7):  #共20周    这是第2-20周  ,如果是21周,把2,21 改成2,22 
    #     L1=L[0] # 获取第一个a
    #     L=L[5:]  #  a暂时离开,后面的号码都进一位。
    #     L.append(L1) # 将a安排到最后一个座位
    #     print(L[0:2]) # 列表是八个循环,我只要其中5个
    #     L2.append(L[0:2])  

    # # 第7周5天
    # for i in range(7,8):  #共20周    这是第2-20周  ,如果是21周,把2,21 改成2,22 
    #     L1=L[0] # 获取第一个a
    #     L=L[2:]  #  a暂时离开,后面的号码都进一位。
    #     L.append(L1) # 将a安排到最后一个座位
    #     print(L[0:5]) # 列表是八个循环,我只要其中5个
    #     L2.append(L[0:5])  


    # # 第8-17周5天
    # for i in range(8,18):  #共20周    这是第2-20周  ,如果是21周,把2,21 改成2,22 
    #     L1=L[0] # 获取第一个a
    #     L=L[5:]  #  a暂时离开,后面的号码都进一位。
    #     L.append(L1) # 将a安排到最后一个座位
    #     print(L[0:5]) # 列表是八个循环,我只要其中5个
    #     L2.append(L[0:5])  

    # # 第18周4天
    # for i in range(18,19):  #共20周    这是第2-20周  ,如果是21周,把2,21 改成2,22 
    #     L1=L[0] # 获取第一个a
    #     L=L[5:]  #  a暂时离开,后面的号码都进一位。
    #     L.append(L1) # 将a安排到最后一个座位
    #     print(L[0:4]) # 列表是八个循环,我只要其中5个
    #     L2.append(L[0:4])  

    # # 第19-20周4天
    # for i in range(19,21):  #共20周    这是第2-20周  ,如果是21周,把2,21 改成2,22 
    #     L1=L[0] # 获取第一个a
    #     L=L[4:]  #  a暂时离开,后面的号码都进一位。
    #     L.append(L1) # 将a安排到最后一个座位
    #     print(L[0:5]) # 列表是八个循环,我只要其中5个
    #     L2.append(L[0:5])  

    # # 第21周2天
    # for i in range(21,22):  #共20周    这是第2-20周  ,如果是21周,把2,21 改成2,22 
    #     L1=L[0] # 获取第一个a
    #     L=L[5:]  #  a暂时离开,后面的号码都进一位。
    #     L.append(L1) # 将a安排到最后一个座位
    #     print(L[0:2]) # 列表是八个循环,我只要其中5个
    #     L2.append(L[0:2])   

    print('---------第4步:xls写入)------') 
    workbook = xlwt.Workbook()# 新建xls工作簿
    sheet = workbook.add_sheet("Sheet")# 新建xls工作簿的工作表的名字是sheet 

   # 第0列 写入“第1周、第2周、第3周……第21周
    dates=[]
    for i in range(1,22):
        n="第{}周".format(i)    # 用遍历方法获得“第1周、第2周、第21周”字样,
        dates.append(n)          # 添加到列表    
    print(dates)        
    # print(date)

    row=1
    for d in range(0, len(dates)):
        sheet.write(row, 0, dates[d])         # 这里enumerate不能用,因为只有一列,所以就用
        row += 1    
    
    # 第0行 写入 星期一  '星期二','星期三','星期四','星期五  #
    weeks = ['周次','星期一','星期二','星期三','星期四','星期五']
    week = len(weeks) 

    col=0
    for d in range(0, len(weeks)):
        sheet.write(0,col,weeks[d])         # 因为只有一行,所以就用有两种写法(enumerate和这种)
        col+= 1  

    # 输入星期的另一种写法
    # col=0 
    # for row,item in enumerate(weeks,0):            # 可以这样写L2[i]=表格内的内容=item,索引数字=col 0代表在A1 1代表在B1
    #     sheet.write(col,row,item)           # 第1行第1列开始写入一行”星期X"
    # col+=1
 
    # 第B2开始写入 运动内容
    arrlan = len(L2)# L2['07', '08', '01', '02', '03']的长度 21组
    row = 1     # 第2行
    for i in range(arrlan):         # 遍历21组[]的总数
        for col,item in enumerate(L2[i],1):            # L2[i]=表格内的内容=item,索引数字=col
            sheet.write(row,col,item)  # row,col,item 行=1、列=索引数字、内容=表格内容 写入第一行第一列
        row += 1   
   
    print('---------第5步:xls保存N份工作簿(每份一页)------')             
    try:
        workbook.save(r"C:\Users\jg2yXRZ\OneDrive\桌面\word2pdf2png\大{}班分散运动.xls".format(gradenum[num]))    # 新建保存 只能xls
        print('计划生成成功')
    except e:
        print('失败...')
        print(e)

print('---------第6步:把N份xls单页内容合并在1个工作簿的N个工作表内)------')      
time.sleep(2)


# 获取目录下所有的表
import os
import pandas as pd

dir = r'C:\Users\jg2yXRZ\OneDrive\桌面\word2pdf2png'
# 获取目录下所有的表
origin_file_list = os.listdir(dir)
print(origin_file_list)

with pd.ExcelWriter(r'C:\Users\jg2yXRZ\OneDrive\桌面\word2pdf2png\运动合.xls') as writer:
	# 循环遍历表格
    for i in origin_file_list:
        # 拼接每个文件的路径
        file_path = dir + '/' + i
        # 把表名赋予给对应的sheet
        sheet_name = i[:-4]
        df = pd.read_excel(file_path)

		# 变相解决表格中第一行第一列为空的缺陷
        ring = "".join(list(str(i) for i in df.index))
        # string = .join(list(str(i) for i in df.index))
        # 判断如果索引都为数字,则不保留索引(根据自己代码调整)
        if ring.isdigit():
            df.to_excel(writer, sheet_name,index=False)
        else:
            df.to_excel(writer, sheet_name)

运行结果

最后会出现一串报错代码,但是不影响运行结果

 桌面上的word2pdf2png

 大1班的运动排序情况

  大3班的运动排序情况

   大7班的运动排序情况

(没有大6班,所以7班就用6班的场地场地,8班用7班场地,9班用8班场地)

本代码的一个好处,也就是让让7-9班的老师,不用去计算跳过班级的项目了。

 特别说明:

虽然程序批量生成了跳过节日的运动场地,但是涉及到节日的部分内容还是需要手动调整。(而且是1个班级的手工剪切复制)

 

实用效果:

组长强推,大家用了都说好

特别感悟:

这个代码是我感觉比较有含金量的作品,为了个体实现,我着重学习了enumerate、len索引数字,列表[X]取值、pop和append的功能,通过反复测试加深对这些代码的理解。

学以致用,提升效率。节约时间去做更有价值的事情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿夏reasonsummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值