【办公类-16-05-04】“2022下学期 大班运动场地分配表-跳过节日循环排序”(python 排班表系列)
生活随笔
收集整理的這篇文章主要介紹了
【办公类-16-05-04】“2022下学期 大班运动场地分配表-跳过节日循环排序”(python 排班表系列)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
樣例展示:跳過節日的運動場地循環排序表(8個班級8組內容 下學期一共20周)
背景需求:
上學期做過一次大班運動場地安排,跳過節日。2023.2下學期運動場地排班(跳過節日)又來了。
一、場地器械微調
二、排序順序不變
三、如果讓節日的格子空在正確的位置?
上學期雖然程序批量生成了跳過節日的運動場地,但是涉及到節日的部分內容還是需要手動調整。(而且是1個班級的手工剪切復制)
比如 第一周周一的2天但是跳過的節日那一周的運動是從星期一開始排的,需要人工手動把場地貼到指定的格子里(如第一周的星期一星期二的內容實際上是星期四、星期五)
本代碼解決的重點——跳過節日,并補全節日名稱,每周正好5個
測算場地及中間節日在五天內的總排序
根據校歷計算數量、設計占位空格
2023年2月17日 2022學年下學期大班分散運動(跳過節日 20周)備份
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=['小小交通車\n(平衡車、三輪車、扭扭車、自行車、木橋)', '爬籠接力賽\n(爬籠、樹屋、沙漏、書包、鈴鐺)', '百變小能手\n(小足球、籮筐、百變迷宮架、墊子、馬甲)', '平衡小勇士\n(長短竹梯、三腳架、長凳、輪胎、安全墊)', '跑跳小達人\n(輪胎、跨欄、鑼鼓、接力棒)', '勇敢者道路\n(背簍、布袋、礦泉水瓶)', '對戰投投樂\n(彈力棉球、吸盤球、飛鏢盤)', '山洞大探險\n(輪胎、安全墊、麻繩)',]# 生成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('大{}班'.format(gradenum[num]))print('---------第3步:如果每周需要跳過假日(考慮跳過假日)------')# 每周需要的天數 (跳過節日.如第1周只有2天工作,9月1-2日(周四周五) ,第3周周一是中秋節放假1天,所以只有4個工作日)# day=['3','5','5','6','5','2','5','5','5','5','5','5','5','5','5','5','5','4','5','5','2']kong=''tt1='清明節'tt2='勞動節'tt3='端午節'# 第1周 第2-7周開始 第8周部分# for d in range(0,1): L2.append(kong) L2.append(kong) for kk in L[0:int(3+5*6+2)]:L2.append(kk) # 清明L2.append(tt1) # 清明后到五一前 for kk in L[int(3+5*6+2):int((3+5*6+2)+(2+5*2))]:L2.append(kk) # 23日(周日)也上班 所以一共6天 一周排5填,28號周五放到下周周一算for kk in L[int((3+5*6+2)+(2+5*2)):int((3+5*6+2)+(2+5*2)+6)]:L2.append(kk) # 勞動節休息休息3天,實際1天空格 (28日放到周一了 周二五一節) L2.append(tt2) # 勞動節456三天上班+6周5填天 1周3天(勞動節后到端午節前)for kk in L[int((3+5*6+2)+(2+5*2+6)):int((3+5*6+2)+(2+5*2+6)+3+(5*6+3))]:L2.append(kk) # 端午節三天,占一個格子在周四 周日要上班頂替周五L2.append(tt3) for kk in L[int((3+5*6+2)+(2+5*2+6)+3+(5*6+3)):int((3+5*6+2)+(2+5*2+6)+3+(5*6+3))+6]:L2.append(kk) print(L2) 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,21):n="第{}周".format(i) # 用遍歷方法獲得“第1周、第2周、第21周”字樣,dates.append(n) # 添加到列表 print(dates) # print(date)row=1for d in range(0, len(dates)):sheet.write(row, 0, dates[d]) # 這里enumerate不能用,因為只有一列,所以就用row += 1 # 第0行 寫入 星期一 '星期二','星期三','星期四','星期五 #weeks = ['周次','星期一','星期二','星期三','星期四','星期五']week = len(weeks) col=0for 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開始寫入 運動內容print('-----------第3步,保存到excle--------')# 以下是xls保存# 在list_date五個五個取值 list3=[]for k in range(0,21):list3.append(L2[k*5:k*5+5]) print(list3)# print(list)for opq in list3:print(opq)# arrlan2 = len(list_d)# 日期抽取5天一組arrlan = len(list3)# L2['07', '08', '01', '02', '03']的長度 21組row = 1 # 第2行for i in range(arrlan): # 遍歷21組[]的總數for col,item in enumerate(list3[i],1): # L2[i]=表格內的內容=item,索引數字=colsheet.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])) # 新建保存 只能xlsprint('計劃生成成功')except e:print('失敗...')print(e)print('---------第6步:把N份xls單頁內容合并在1個工作簿的N個工作表內)------') time.sleep(2)# 獲取目錄下所有的表 import os import pandas as pddir = 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\20230217大班分散運動(編程詳細版 跳過節日).xls') as writer:# 循環遍歷表格for i in origin_file_list:# 拼接每個文件的路徑file_path = dir + '/' + i# 把表名賦予給對應的sheetsheet_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)導出位置
最初的樣式是這樣的(節日已經寫進去了)
全選每張表格,進行格式設置。
第11-12周 五一勞動節的排班比較亂,所以加彩色底紋,最下面備注號這一周的“星期排序”(周六周日要補班)
大3班的運動排序情況
大7班的運動排序情況
(沒有大6班,所以7班就用6班的場地場地,8班用7班場地,9班用8班場地)
實用效果:
組長強推收藏
特別感悟:
第二次用這個代碼做運動場地排列,我感覺人工排場地很費時費力,沒有必要。利用程序提高文本資料產生的效率,更精確,更快速。
學以致用,提升效率。節約時間去做更有價值的事情。
總結
以上是生活随笔為你收集整理的【办公类-16-05-04】“2022下学期 大班运动场地分配表-跳过节日循环排序”(python 排班表系列)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Failed to connect to
- 下一篇: 由南非世界杯足球赛的用球“JABULAN