「已注销」 2022-02-18 12:39 采纳率: 0%
浏览 28

【Python】如何制作一个自动输出所有选课方案的程序?(全局变量、定义列表的列表、递归、xlrd)

问题遇到的现象和发生背景

转专业学生刚开学第三轮选课,需要补一些大一的课,但是这些课通常会与本学期上的专业课时间冲突,又不想晚上去上重修班,请问如何才能制作一个程序,帮我计算出所有可能的课表?
备注:学校所有课程的开课情况可以查到几个选择,课程名称,上课时间等

img

img

问题相关代码,请勿粘贴截图

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一直不对劲。感觉这个变量用来存储上一次运行的结果有点太麻烦了

我想要达到的结果

现在第三轮选课开始了,仍然有一门课冲突,我想力争搞个没冲突的课表
甚至还想搞一个数据库呵呵反正也是闲着

  • 写回答

3条回答 默认 最新

  • CSDN专家-HGJ 2022-02-18 16:42
    关注

    从代码中第37行看,time_temporary应该是一个二层嵌套列表,而在第11行定义time_temporary时,用法不正确,其值为None。
    可以改写成如下:
    time_temporary = [time]

    评论

报告相同问题?

问题事件

  • 创建了问题 2月18日

悬赏问题

  • ¥15 pcl运行在qt msvc2019环境运行效率低于visual studio 2019
  • ¥15 MAUI,Zxing扫码,华为手机没反应。可提高悬赏
  • ¥15 求帮看看那里的问题ssh项目报错
  • ¥15 python运行报错 ModuleNotFoundError: No module named 'torch'
  • ¥100 华为手机私有App后台保活
  • ¥15 sqlserver中加密的密码字段查询问题
  • ¥20 有谁能看看我coe文件到底哪儿有问题吗?
  • ¥20 我的这个coe文件到底哪儿出问题了
  • ¥15 matlab使用自定义函数时一直报错输入参数过多
  • ¥15 设计一个温度闭环控制系统