2015-09-13 221 views
1

我有兩個文件:q.txt包含單詞,p.txt包含句子。我需要檢查q.txt中的任何單詞是否存在於p.txt中。以下是我寫的內容:在Python中嵌套for循環不會增加外循環

#!/usr/bin/python 
twts=open('p.txt','r'); 
words=open('q.txt','r'); 
for wrd in words: 
     for iter in twts: 
       if (wrd in iter): 
         print "Found at line" +iter 

即使匹配,它也不打印輸出。另外,我可以看到外部for循環不會繼續執行單詞對象中的下一個值。有人能解釋我在這裏做錯了什麼嗎?

編輯1:我正在使用Python 2.7 編輯2:對不起,我混合了變量名稱。現在糾正了它。

回答

0

看來你混淆了2個文件。您說q.txt包含這些字詞,但您將p.txt存儲到words變量中。

3

當您遍歷一個文件對象時,完成迭代後,遊標結束在文件的末尾。所以試圖再次迭代它(在外循環的下一次迭代中)將不起作用。代碼工作的最簡單方法是在外部for循環開始時尋找文件的起始位置。示例 -

#!/usr/bin/python 
words=open('q.txt','r'); 
twts=open('p.txt','r'); 
for wrd in words: 
    twts.seek(0) 
    for twt in twts: 
     if (wrd.strip() in twt): 
      print "Found at line" +iter 

另外,根據這個問題,好像你正在使用錯誤的文件,twts應與句子的文件,並words文字的文件。但是你已經爲wordsq.txt打開了p.txt。如果相反,你應該打開其他文件。

而且,會建議不要使用iter作爲變量名,因爲這也是一個內置函數的名稱,你定義它 - for iter in twts - 陰影內置功能 - iter()

+0

謝謝, 這樣可行。但是,我們不應該每次都試圖找到文件的開頭,我們是不是應該試圖重新開始下一個單詞呢? – seriousgeek

+1

你是什麼意思開始下一個單詞?在外循環的下一次迭代中,您已經轉向下一個單詞。但是你的內在循環不會因爲你已經達到文件結束而去。所以你必須重新開始。 –

2

如果您發佈了文件的內容,但是您是否將\n從行中分割出來,會更好嗎?這個工作對我來說:

words = open('words.txt', 'r') 
twts = open('sentences.txt', 'r') 

for w in words: 
    for t in twts: 
     if w.rstrip('\n') in t.rstrip('\n'): 
      print w, t 
0

當你迭代的鳴叫,一旦你已用盡迭代器,你指針是在文件的結尾因此沒有在第一次迭代後,迭代,你可以seek重複,但如果單詞不是一個巨大的文件,您可以製作一組所有的單詞,因此您只需在0(n * k)的運行時間內遍歷一次句子文件,而不是每次讀取每行的二次方案單詞在你的文件中,拆分也會匹配確切的單詞而不是子串:

from string import punctuation 
with open('p.txt','r') as twts, open('q.txt','r') as words: 
    st = set(map(str.rstrip,words)) 
    for line in twts: 
     if any(word.rstrip(punctuation) in st for word in line.split()): 
       print("Found at line {}".format(line))