2012-09-24 19 views
1

我在Python 2.72中遇到了一個循環問題,這讓我非常沮喪。基本上循環不會在第一個索引j上迭代,我嘗試了各種方法來修復它,但沒有運氣。嚴重難以捉摸的循環(絞盡腦汁!)

def learn(dataSet): 
    for i in dataSet.getNext(): 
     recall = raw_input("Enter all members of %s you are able to recall >>> (separated by commas) " % (i.getName())) 
     missed = i.getMembers()  
     missedString = []  
     for a in missed: 
      missedString.append(a.getName())  

這是我無法迭代的循環。第一個for循環僅在分割字符串列表中經歷j的第一次迭代,然後將其從missedString中刪除。我想要從missedString中刪除拆分字符串recall的所有成員。

for j in string.split(recall, ','): 
    if j in missedString: 
     missedString.remove(j) 
     continue 
for b in missed: 
    if b.getName() not in missedString: 
     missed.remove(b) 
print 'You missed %d. ' % (len(missed)) 
if (len(missed)) > 0: 
    print 'Maybe a hint or two will help...' 
    for miss in missed: 
     remind(miss.getSecs(), i.getName(), missed) 

如何解決上述問題?

+1

當你輸入'recall'時,你是否也輸入逗號後的空格? –

+0

@WarrenWeckesser我不認爲這是問題,但這是我檢查的一件事 – user1693359

回答

5

missedString是一個列表一個可怕的名字

請注意,您可以簡化你的代碼中有幾個地方

 missedString = []  
     for a in missed: 
      missedString.append(a.getName())  

可以通過列表理解

 missedString = [a.getName() for a in missed] 

被替換在這裏,您只需使用recallsplit方法而不是string.split)。它看起來好像這個循環應該嵌套在for i循環中,所以我會假定它是(如果不是,那麼您將使用錯誤的數據集的召回值)。

for j in string.split(recall, ','): 
    if j in missedString: 
     missedString.remove(j) 
     continue 

它也可以被列表理解所取代。

recall_set = set(recall.split(',')) 
missedString = [j for j in missedString if j not in recall_set] 

這將無法正常工作,如,例如。用戶輸入的輸入多餘的空格,所以這是一個好主意,strip()這些元素

recall_set = set(s.strip() for s in recall.split(',')) 
missedString = [j for j in missedString if j not in recall_set] 

這個環路有一個嚴重的問題。通常,從正在迭代的列表中刪除元素並不是一個好主意。你會結束時跳過一些內容,不檢查他們

for b in missed: 
    if b.getName() not in missedString: 
     missed.remove(b) 

也許列表理解可以再次

missed = [b for b in missed if b.getName() in missedString] 
+0

非常感謝,您的文章是非常有幫助的。問題解決了,將來我會更加樂於列表理解。 – user1693359

0

幫助在此代碼

for j in string.split(recall, ','): 
    if j in missedString: 
     missedString.remove(j) 
     continue 

嘗試添加

else: 
     print 'Didn't remove "%s"' % j 

(並擺脫continue。它沒有達到任何目的)。

您可能錯過了拆分中的一些空白。如果是這種情況,請添加j = j.strip()或使用re.split(r'\s*,\s*', recall)代替string.split(recall, ',')

+0

這有幫助!我沒有考慮額外的空白區域,分割是一個更好的選擇。謝謝! – user1693359