小学课程表自动生成:Python Pandas 代码实现
import pandas as pd
定义科目和指定课时量
subjects = { '语文': [4, 4, 4, 4, 4, 4], '数学': [4, 4, 4, 4, 4, 4], '英语': [4, 4, 4, 4, 4, 4], '体育': [2, 2, 2, 2, 2, 2], '科学': [2, 2, 2, 2, 2, 2], '音乐': [2, 2, 2, 2, 2, 2], '美术': [2, 2, 2, 2, 2, 2], '生活': [2, 2, 2, 2, 2, 2], '历史': [2, 2, 2, 2, 2, 2], '地理': [2, 2, 2, 2, 2, 2], '体育': [2, 2, 2, 2, 2, 2] }
定义教师和指定课时量
teachers = { '教师1': 20, '教师2': 20, '教师3': 20, '教师4': 20, '教师5': 20, '教师6': 20, '教师7': 20, '教师8': 20, '教师9': 20, '教师10': 20, '教师11': 20 }
定义班级和年级
grades = ['1年级', '2年级', '3年级', '4年级', '5年级', '6年级'] classes = ['班级1', '班级2', '班级3', '班级4', '班级5', '班级6']
创建一个空的DataFrame
df = pd.DataFrame(index=range(1, 8), columns=range(1, 8))
填充数据
for grade_index, grade in enumerate(grades): for class_index, class_name in enumerate(classes): for day in range(1, 6): for period in range(1, 8): # 判断是否是语文、数学、英语科目,且在每天的前3节课里 if (period <= 3) and (df.loc[day, period] not in ['语文', '数学', '英语']): # 找到当前年级和班级对应的科目列表 subject_list = subjects[grade] # 找到当前年级和班级对应的教师列表 teacher_list = teachers[class_name] # 遍历科目列表和教师列表,找到一个可用的科目和教师 for subject, teacher in zip(subject_list, teacher_list): # 判断当前科目和教师的课时量是否大于0 if (subject > 0) and (teacher > 0): # 更新DataFrame中的值 df.loc[day, period] = subject # 更新科目和教师的课时量 subjects[grade][subject_list.index(subject)] -= 1 teachers[class_name][teacher_list.index(teacher)] -= 1 break # 判断是否是体育科目,且不在每天的前3节课里 elif (period > 3) and (df.loc[day, period] != '体育'): # 找到当前年级和班级对应的科目列表 subject_list = subjects[grade] # 找到当前年级和班级对应的教师列表 teacher_list = teachers[class_name] # 遍历科目列表和教师列表,找到一个可用的科目和教师 for subject, teacher in zip(subject_list, teacher_list): # 判断当前科目和教师的课时量是否大于0 if (subject > 0) and (teacher > 0): # 更新DataFrame中的值 df.loc[day, period] = subject # 更新科目和教师的课时量 subjects[grade][subject_list.index(subject)] -= 1 teachers[class_name][teacher_list.index(teacher)] -= 1 break # 判断是否是非语文科目 elif (df.loc[day, period] not in ['语文', '英语']) and (df.loc[day, period - 1] != '英语'): # 找到当前年级和班级对应的科目列表 subject_list = subjects[grade] # 找到当前年级和班级对应的教师列表 teacher_list = teachers[class_name] # 遍历科目列表和教师列表,找到一个可用的科目和教师 for subject, teacher in zip(subject_list, teacher_list): # 判断当前科目和教师的课时量是否大于0 if (subject > 0) and (teacher > 0): # 更新DataFrame中的值 df.loc[day, period] = subject # 更新科目和教师的课时量 subjects[grade][subject_list.index(subject)] -= 1 teachers[class_name][teacher_list.index(teacher)] -= 1 break
将DataFrame输出到Excel
df.to_excel('课程表.xlsx', index=False)
原文地址: https://www.cveoy.top/t/topic/qosJ 著作权归作者所有。请勿转载和采集!