[英]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_name
或class_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_done
和classes_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.