问题遇到的现象和发生背景
转专业学生刚开学第三轮选课,需要补一些大一的课,但是这些课通常会与本学期上的专业课时间冲突,又不想晚上去上重修班,请问如何才能制作一个程序,帮我计算出所有可能的课表?
备注:学校所有课程的开课情况可以查到几个选择,课程名称,上课时间等
问题相关代码,请勿粘贴截图
import xlrd
i = 0
t = 0
data = xlrd.open_workbook("课程情况.xls") # data为Excel文件地址
sheets = data.sheet_names() # 获得该excel文件下sheet的名字,返回值是列表
sheets_number = len(sheets) # 获得课程个数
time = [0 for index in range(25)] # 初始化课程表
time_all = []
time_temporary = [].append(time)
project_time_transfer = {"周一第1": "1", "周一第3": "2", "周一第5": "3", "周一第7": "4", "周一第9": "5"
, "周二第1": "6", "周二第3": "7", "周二第5": "8", "周二第7": "9", "周二第9": "10"
, "周三第1": "11", "周三第3": "12", "周三第5": "13", "周三第7": "14", "周三第9": "15"
, "周四第1": "16", "周四第3": "17", "周四第5": "18", "周四第7": "19", "周四第9": "20"
, "周五第1": "21", "周五第3": "22", "周五第5": "23", "周五第7": "24", "周五第9": "25"}
def try_the_course(i):
global ready_project, t # 声明全局变量
global time_all
global time
global time_temporary
table = data.sheet_by_index(i) # 打开这个表
project_name = table.col_values(1, start_rowx=1, end_rowx=None) # 返回课程名称列表
project_time_all = table.col_values(8, start_rowx=1, end_rowx=None) # 返回课程时间列表
project_time_all_str = [str(k) for k in project_time_all] # 课程时间列表转化为字符串列表
for j in range(len(project_name)): # 这门课第一个选择开始循环
if project_time_all_str[j].count(";") == 0: # 检查是不是每周一节课
time1_str = project_time_all_str[j][0:4]
time2_str = time1_str
else:
project_time = project_time_all_str[j].split(';') # 把上课时间分开
time1_str = project_time[0][0:4] # 取前半截关键词
time2_str = project_time[1][0:4] # 取后半截关键词
time1 = int(project_time_transfer[time1_str]) # 取得每周第一节课时间代号
time2 = int(project_time_transfer[time2_str]) # 取得每周第二节课时间代号
if (time_temporary[t])[(time1 - 1)] == 0 and (time_temporary[t])[(time2 - 1)] == 0: # 检查在上一次运行的基础上是否成功
time_time = time_temporary[t] # 写入并存储到time_temporary
time_time[(time1 - 1)] = project_name[i]
time_time[(time2 - 1)] = project_name[i]
time_temporary = time_temporary.append(time_time)
t = t + 1
if i == (sheets_number-1):
time_all = time_all.append(time_temporary[t-1])
break
else:
i = i+1
try_the_course(i)
else:
i = i-1
try_the_course(i)
try_the_course(i)
print(time_all)
运行结果及报错内容
TypeError: 'NoneType' object is not subscriptable
我的解答思路和尝试过的方法
我之前思考这个问题,是一个一个选,比如第一门课是A,第二门课是B,从第一门课第一个(A1)开始选,选完后选第二门课(B),也就是说创建一个空列表,有一节课选上就给它一个1,冲突了尝试这门课下一个选择直到结束,
为了让python读取信息,我东拼西凑自学了一些xlrd,然后二级C水平让我只能做一个两层循环,结果发现只能选中第一节课,然后我又想了想应该搞递归,(捋了捋人类做这个事情的思路:先一直向后选直到没有选的再回来选一次,),搞了半天就成这个代码了。不过time_temporary一直不对劲。感觉这个变量用来存储上一次运行的结果有点太麻烦了
我想要达到的结果
现在第三轮选课开始了,仍然有一门课冲突,我想力争搞个没冲突的课表
甚至还想搞一个数据库呵呵反正也是闲着