簡體   English   中英

如果在語句中出現問題

[英]If in statement problems

我正在嘗試制定一個計划,這是一個課程列表,只有在完成必修課或在同一學期參加必修課時才能添加這些課程。

下面我的代碼幾乎可以工作,但它總是重用這些類,即使它們已經完成/使用。 我試圖用and (class_list[i][0] not in classes_done)來防止這種情況,我希望它不會 go 進入 if 語句,但它似乎被忽略了。

這個 if 語句的 rest 似乎工作正常。 (class_list[i][3] == '' or class_list[i][3] in classes_done)這個 class 是否需要完成 class 如果是,它是否已經完成? (class_list[i][2] in classes_for_semester or class_list[i][2] == '')這個 class 是否有一個並存的 class 如果是,它是在 class_for_semester 中還是已經完成?

class_list變量的組織方式如下['name', 'credit', 'co-requisite', 'required completed classes', 'empty'] 我將其他變量添加為注釋以顯示它們的外觀。

class PlanGenerator:
def generator(max_credit_allowed, min_credit_allowed, classes_done, class_list):
    classes_for_semester = []
    credits_for_semester = 0
    semester = 0
    full_plan = []
    # class_list = [['MA 241 ', '4', '', '', ''], ['PS 150 ', '3', 'MA 241 ', '', ''], ['UNIV 101', '1', '', '', ''], ['COM 122', '3', '', '', ''], ...]
    # max_credit_allowed = 16
    # min_credit_allowed = 12
    # classes_done=['UNIV 101']
    while len(classes_done) != len(class_list): # keep going until all classes are used
        while int(min_credit_allowed) > credits_for_semester: # keep going until at least the minimum credits are in the semester
            semester += 1
            for i in range(len(class_list)): # looping over the class list
                if int(class_list[i][1]) + credits_for_semester < max_credit_allowed: #if this class was to be added would it go over the max credit for semester if yes go to next class
                    if (class_list[i][3] == '' or class_list[i][3] in classes_done) and (class_list[i][2] in classes_for_semester or class_list[i][2] in classes_done or class_list[i][2] == '') and (class_list[i][0] not in classes_done):
                        classes_for_semester.append(class_list[i][0])
                        credits_for_semester += int(class_list[i][1])
                        print('classes for semester', classes_for_semester)
                        print('semester credits', credits_for_semester)
            classes_done.append(classes_for_semester)
            full_plan.append(semester)
            full_plan.append(classes_for_semester)
            print('full plan', full_plan)
            classes_for_semester = []
            credits_for_semester = 0
    print('done')
    print(full_plan)

我希望我的解釋是有道理的。 也許有人可以理解我的錯誤並幫助我找到一個好的解決方案。 另外,如果您看到任何可以使此代碼更簡單的內容,請告訴我。

非常感激

首先,您的while int(min_credit_allowed) > credits_for_semester行導致無限循環。 它需要更改為

while len(classes_done) != len(class_list) and int(min_credit_allowed) > credits_for_semester: # Remove the second while loop

其次,您將一個列表附加到一個列表中,因此您使用classes_done.append(classes_for_semester)獲得了classes_done的二維列表

這應該是

classes_done += classes_for_semester

這樣您就可以將classes_done classes_for_semester ,而不是添加列表。

您的新代碼應如下所示:

def generator(max_credit_allowed, min_credit_allowed, classes_done, class_list):
    classes_for_semester = []
    credits_for_semester = 0
    semester = 0
    full_plan = []
    # class_list = [['MA 241 ', '4', '', '', ''], ['PS 150 ', '3', 'MA 241 ', '', ''], ['UNIV 101', '1', '', '', ''], ['COM 122', '3', '', '', ''], ...]
    # max_credit_allowed = 16
    # min_credit_allowed = 12
    # classes_done=['UNIV 101']
    while len(classes_done) != len(class_list) and int(min_credit_allowed) > credits_for_semester: # keep going until at least the minimum credits are in the semester
        semester += 1
        for i in range(len(class_list)): # looping over the class list
            if int(class_list[i][1]) + credits_for_semester < max_credit_allowed: #if this class was to be added would it go over the max credit for semester if yes go to next class
                if (class_list[i][3] == '' or class_list[i][3] in classes_done) and (class_list[i][2] in classes_for_semester or class_list[i][2] in classes_done or class_list[i][2] == '') and (class_list[i][0] not in classes_done):
                    classes_for_semester.append(class_list[i][0])
                    credits_for_semester += int(class_list[i][1])
                    print('classes for semester', classes_for_semester)
                    print('semester credits', credits_for_semester)
        classes_done += classes_for_semester
        full_plan.append(semester)
        full_plan.append(classes_for_semester)
        print('full plan', full_plan)
        classes_for_semester = []
        credits_for_semester = 0
    print('done')
    print(full_plan)

我強烈建議對不存在的值使用None而不是'' ,這樣您就可以對空字符串執行簡單的value is None檢查而不是相等檢查。

對於您傳入的 class 信息列表,我會將它們更改為類、字典或命名元組(在此處了解有關它們的更多信息),以便您可以輕松地通過名稱而不是數字來引用值。 class_list[i].class_nameclass_list[i]['class_name']在未來比魔術索引更容易調試。 您甚至可以更改您的for循環以使用實際的 class 詳細信息作為變量而不是i in range(len(class_list)) ,如下所示:

for c in class_list:
   if int(c.credits) .... # Using a class or namedtuple approach as suggested above

還有一件小事可能不是一個大問題,但如果這些列表變長可能會成為一個問題:考慮使用sets而不是lists來存儲classes_doneclasses_for_semester類的東西。 它還可以防止存儲重復項(假設您不想多次存儲相同的 class )。


要提供namedtuple建議的具體示例,您可以執行以下操作:

from collections import namedtuple
ClassList = namedtuple('ClassList', ['class_name', 'credits', 'coreq', 'prereq'])

class_list = [
    ClassList(class_name='MA 241', credits=4, coreq=None, prereq=None),
    ClassList(class_name='PS 150', credits=3, coreq='MA 241', prereq=None),
    # ...
]

所以你的 for 循環變成

for c in class_list:
    if c.credits + credits_for_semester < max_credits_allowed:
        if (c.prereq is None or c.prereq in classes_done) and \
           (c.coreq in classes_for_semester or c.coreq in classes_done or c.coreq is None) and \
           (c.class_name not in classes_done):
            classes_for_semester.append(c.class_name)
            credits_for_semester += c.credits
classes_done += classes_for_semester
full_plan.append(semester)
full_plan.append(classes_for_semester)
classes_for_semester = []
credits_for_semester = 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM