- “CLASSROOM_NUM = 14” 用来设置教室数
import pandas as pd
from Office_kaifang.class_arrange.data import dict_kf_classroom, dict_class_level
# 打开表格
path = '2019-2020第一学期开放教育开课一览表.xlsx'
# df = pd.read_excel(io=path, sheet_name='自开开课一览表')
df = pd.read_excel(io=path, sheet_name='网授开课一览表')
col_names_ls = df.columns.tolist() # 获取标题行列表
col_names_ls.insert(0, '时间段')
# col_names_ls.insert(1, '教室')
# todo 提取数据结构
# todo 唯一值列表
ls_teachers = df['任课教师'].unique().tolist()
ls_courses = df['课程名称'].unique().tolist()
ls_classes = df['专业班级'].unique().tolist()
# todo 建立字典
def get_courses_dict():
'''
以课程为键,建立"课程:班级"字典
:return: 返回"课程:班级"字典
'''
courses_dict = dict() # 创建课程空字典
for course in ls_courses: # 从课程列表中取课程
ls = [] # 创建一个空列表,用来存放班级
for i in range(df.shape[0]): # 从表中提取数据
if df.iloc[i, 0] == course: # 如果找到相同的课程名称
d = dict() # 创建一个空字典用来存放"班级:其它"信息字典
# 把其它信息作为一个列表
data_ls = []
for j in range(2, df.shape[1]):
data_ls.append(df.iloc[i, j])
d.update({df.iloc[i, 1]: data_ls}) # 加入字典
# 把班级----其他信息字典加作为元素入列表
ls.append(d) # 把对应的专业班级添加进列表
courses_dict.update({course: ls}) # 得到"课程:班级"字典
return courses_dict
# todo 思路:通过课程,找到管理班(包含任课教师等所有信息);
# todo 从课程列表取出一门课;
# todo 该课程对应的值也就是班级列表中的每一个班在班级列表(总表)中进行查询;
# todo 如果每个值都找到了,把数据以列表的形式写入结果列表;
# todo 同时从课程总列表中弹出这个课程,从班级列表(总表)中弹出找到的班级;
def get_1_time(courses_dict, set_classes, ls_courses, set_teachers, CLASSROOM_NUM, dict_class_level):
'''
# 获取一个时间段数据
:param courses_dict: 课程所对应的班级字典列表
:param set_classes: 班级集合(总表)
:param ls_courses: 课程列表(每一次排课需要传入刨除已成功的课程)
:return:data_ls(一次排课数据), have_courses_set(已被安排的课程)
'''
# 结果数据列表
data_ls = []
# 已选课程集合
have_courses_set = set()
# 用来记录课程名称
classes_ls_ = []
# 初始化计数器
COUNTER = 1
# 从优先级课程字典取出按顺序取出课程
for course, _ in dict_class_level.items():
# print(course)
if not COUNTER == 0:
classes_ls = courses_dict[course] # 课程所对应的班级字典列表
# 获取班级名称集合
classname_set = set()
# 获取任课教师集合
tescher_set = set()
for class_dict in classes_ls:
classname = list(class_dict.keys())[0]
classname_set.add(classname)
for k, v in class_dict.items():
tescher_set.add(v[0])
# 用集合判断班级名称是否在班级列表(总表)中
if classname_set < set_classes and tescher_set < set_teachers:
have_courses_set.add(course)
for class_dict in classes_ls:
for k, v in class_dict.items():
ls = []
ls.append(course) # 添加课程名称
ls.append(k) # 添加班级名称
for i in v:
ls.append(i) # 添加其他信息
data_ls.append(ls)
# 记录已编排课程名称
classes_ls_.append(course)
# 列表去重
classes_ls_ = list(set(classes_ls_))
# print(classes_ls_)
# print(len(data_all_ls))
set_classes = set_classes - classname_set
set_teachers = set_teachers - tescher_set
# dict_class_level.pop(course) # 从优先级课程列表弹出课程
else:
print('教室满了')
break
COUNTER = len(classes_ls_) % CLASSROOM_NUM
# print(classes_ls_)
# print(COUNTER)
return data_ls, have_courses_set
# 获取班级、课程名称、任课教师集合
set_classes = set(ls_classes)
set_courses = set(ls_courses)
set_teachers = set(ls_teachers)
ls_classes_ = ls_classes.copy() # 用深度拷贝,是复制不是指针
courses_dict = get_courses_dict() # 调用函数创建"课程:班级"字典
i = 1
data_all_ls = []
while len(set_courses) > 0:
# print(len(set_courses)) # 如果课程长度大于零,说明课程没有被排完
# todo 设置教室数量
CLASSROOM_NUM = 14
ls_courses = list(set_courses)
# 获取排课列表
data_ls, have_courses_set = get_1_time(courses_dict, set_classes, ls_courses, set_teachers, CLASSROOM_NUM,
dict_class_level)
# 添加时间段序号,及教室号
class_room_num = 0
for data in data_ls:
data.insert(0, str(i))
# try:
# data.insert(1, list(dict_kf_classroom.keys())[class_room_num])
# # print(data)
# except:
# break
data_all_ls.append(data)
class_room_num += 1
# 从课程中减去已排课程
set_courses = set_courses - have_courses_set
# 从优先级课程字典中弹出已排课程
for have_course in list(have_courses_set):
dict_class_level.pop(have_course)
i += 1
# todo 写入Excel
data_all = pd.DataFrame(data_all_ls, columns=col_names_ls)
writer = pd.ExcelWriter('排课结果.xlsx')
data_all.to_excel(writer, '排课结果', index=False)
writer.save()
# import pandas as pd
# 打开表格
# path = '2019-2020第一学期开放教育开课一览表.xlsx'
# df = pd.read_excel(io=path, sheet_name='优先级')
# #
# ls_class_name = df['课程名称'].tolist()
# ls_class_level = df['优先级'].tolist()
# #
# print(ls_class_name)
# print(ls_class_level)
# #
# dict_class_level = dict(zip(ls_class_name, ls_class_level))
# print(dict_class_level)
# 开放可用教室字典
dict_kf_classroom = {'512': 70, '机房1': 40, '机房4': 40, '机房5': 40, '机房9': 40, '机房6': 25, '机房7': 25, '机房8': 25, '机房10': 25,
'机房11': 25, '机房12': 25}
# print(list(dict_kf_classroom.keys())[0])
# k=list(dict_kf_classroom.keys())
# i=1
# for i in range(9):
# print(k[i])
dict_class_level = {'办公室管理': 1, '西方行政学说': 2, '电子政务': 3, '公司法': 4, '国际经济法': 5, '国际贸易法': 6, '国际私法': 7, '商法': 8,
'西方行政制度': 9, '个人与团队管理': 10, '合同法': 11, '教育心理学': 12, '民法学(1)': 13, '民法学(2)': 14, '社会心理学': 15,
'社会学概论': 16, '学前儿童发展心理学': 17, '人力资源管理': 18, '西方经济学': 19, '管理学基础': 20, '微积分基础': 21, '金融市场': 22,
'机械CAD/CAM': 23, '高等数学基础': 24, '实用卫生统计学': 25, '机电一体化系统设计基础': 26, '政府经济学': 27, '经济法律基础': 28,
'经济法学': 29, '管理会计': 30, '企业集团财务管理': 31, '政治经济学': 32, '建筑制图基础': 33, '基础会计': 34, '金融企业会计': 35,
'小企业管理': 36, '建筑施工技术方案设计': 37, '经济数学基础12': 38, '数控机床': 39, '液压气动技术课程设计': 40, '液压与气压传动': 41,
'公共部门人力资源管理': 42, '区域经济学': 43, '国际公法': 44, '现代产权法律制度专题': 45, '知识产权法': 46, '财务管理': 47, '现代管理原理': 48,
'财会法规与职业道德': 49, '成本管理': 50, '企业战略管理': 51, '机械制图': 52, '计算机绘图(本)': 53, '土木工程CAD': 54, '公司概论': 55,
'流通概论': 56, '监督学': 57, '劳动合同法(本科)': 58, '劳动与社会保障法': 59, '刑法学(1)': 60, '刑法学(2)': 61, '金工实习': 62,
'人文英语1': 63, '人文英语2': 64, '人文社会科学基础': 65, '纳税筹划': 66, '行政法与行政诉讼法': 67, '幼儿游戏与玩具': 68,
'学前儿童健康教育': 69, '学前儿童社会教育': 70, '0-3岁婴幼儿的保育与教育': 71, '儿童家庭教育指导': 72, '学前儿童艺术教育(音乐)': 73,
'会计制度设计': 74, '中级财务会计(二)': 75, '中级财务会计(一)': 76, '婚姻家庭法学': 77, '幼儿园课程与活动设计': 78, '民事诉讼法学': 79,
'刑事诉讼法学': 80, '中国法制史': 81, '中外政治思想史': 82, '当代中国政治制度': 83, '行政领导学': 84, '宪法学': 85, '政治学原理': 86,
'人文英语3': 87, '心理学': 88, '管理英语1': 89, '金融学': 90, '西方经济学(本)': 91, '管理英语2': 92, '消费者权益保护法': 93,
'社交礼仪': 94, '中国传统文化概观': 95, '小学生心理健康教育': 96, '组织行为学': 97, '生产与运作管理': 98, '法律文书': 99, '环境资源法': 100,
'幼儿文学': 101, '法理学': 102, '公共行政学': 103, '社会调查研究与方法': 104, '公共关系学': 105, '教育学': 106, '电子商务概论': 107,
'统计学原理': 108, '理工英语1': 109, '混凝土结构设计原理': 110, '幼儿美术与手工': 111, '理工英语3': 112, '传感器与测试技术课程设计': 113,
'可编程控制器应用': 114, '城市管理学': 115, '学前教育学': 116, '学前儿童艺术教育(美术)': 117, '资源与运营管理': 118, '计算机应用基础(本)': 119,
'计算机应用基础': 120, '管理英语3': 121, '应用写作(汉语)': 122, '市场营销学': 123, '程序设计基础': 124, '金融风险管理': 125,
'行政组织学': 126, '公共政策概论': 127, '实用写作': 128, '数理统计': 129, '房地产经营与管理': 130, '幼儿园管理': 131}
# ls=[]
# for k, _ in dict_class_level.items():
# print(k)
# ls.append(k)
# dict_class_level.pop('办公室管理')
# print(ls)
网友评论