2014-03-02 50 views
0
tup1 = [('Math 101', 'Algebra', 'Fall 2013', 'A'), 
('History 201', 'WorldWarII', 'Fall 2013', 'B'), 
('Science 301', 'Physics', 'Fall 2013', 'C'), 
('English 401', 'Shakespeare', 'Fall 2013', 'D')] 

choice = 0 

while choice !=3: 

print ("***********MENU************") 
print ("1. Drop class") 
print ("2. Print gradebook") 
print ("3. Quit") 

choice = (int(input("Please choose 1-2 to perform the function. \nPress 3 to exit the program. Thank you. \n"))) 
if choice == 1: 
dropped_class = raw_input ("Which class would you like to drop? Enter class: ") 
found = False 
for class_tup in tup1: 
    if dropped_class in class_tup[0]: 
     found = True 
    if found: 
     tup1.remove(class_tup) 
elif choice == 2: 
    print tup1 
elif choice == 3: 
    print ("Exit program. Thank you.") 
else: 
    print ("Error.") 

當我去砸類,如果我在數學101型,它不僅刪除Math類,也有科學課。任何想法爲什麼?關於 「數學101」 沒有涉及科學101部分...刪除多於我要求的元素刪除?

+0

您需要修復'while'循環的縮進。 – Ffisegydd

+0

它是固定的 - 粘貼的代碼中的縮進不正確。我在終端中運行它時沒有出現任何錯誤,但是當我只要求移除我不理解的數學時,科學就會被刪除。 – TommyConnor

+0

我在'while choice!= 3:'後面的下一行出現縮進錯誤(如您所期望的):'沒有縮進。 – Ffisegydd

回答

1

您需要更改此:

for class_tup in tup1: 
    if dropped_class in class_tup[0]: 
     found = True     # now found == True for the rest of the loop 
    if found: 
     tup1.remove(class_tup) 

這樣:否則

for class_tup in tup1:    # incidentally, tup1 is a list not a tuple 
    if dropped_class in class_tup[0]: 
     tup1.remove(class_tup) 
     break # stops the iteration, which seems to be what you are trying to do 

,你會刪除所有class_tup在找到dropped_classclass_tup[0]之後的for循環的其餘部分。

作爲一個方面說明,你可能想要對你的命名約定做些修改(除其他外)。例如,tup1應該可能只是courses或類似的東西。

+0

同樣的問題。哎呀:( – TommyConnor

+0

@TommyConnor哎呀,對不起,我無意中省略了你的if子句,現在就修正了吧 –

+0

我覺得可行,非常感謝J-Biebs! – TommyConnor

0

這裏還有另外一個問題,那就是當你迭代它時從列表中刪除元素。這會讓翻譯混淆,最終你會跳過列表中的元素(儘管在這個例子中並不重要)。您可以解決此問題通過使列表的臨時副本來遍歷:

for class_tup in tup1[:]: # [:] makes a copy of the list 
    if dropped_class in class_tup[0]: 
     tup1.remove(class_tup) 

我要補充,爲什麼它不能在這種情況下,重要(但會採取一種好習慣)的原因是你只希望每個循環都有一個匹配。假設情況總是如此,您應該在tup1.remove(class_tup)之後添加break。同樣,這裏不會有太大的區別,但會加快處理更長的列表。