2017-03-03 220 views
0

我嘗試編寫一個python腳本來搜索txt文件(英文字典)中的anagrams。我有這三項功能:python for循環未執行

def is_anagram(a,b): 
    a_ = list(a) 
    a_.sort() 
    b_ = list(b) 
    b_.sort() 
    if a_ == b_ and a != b: 
     return True 
    else: 
     return False 

def find_anagrams(word,t): 
    _res=[word] 
    for line in t: 
     check = line.strip() 
     if is_anagram(check,word): 
      _res += [check] 
    return _res 

def find_all_anagrams(f): 
    res = {} 
    void = [] 
    for line in f: 
     word = line.strip() 
     _list = list(word) 
     _list.sort() 
     key = tuple(''.join(_list)) 
     if key not in res and key not in void: 
      if find_anagrams(word,f) == []: 
       void += [key] 
      res[key] = find_anagrams(word,f) 
    return res 

如果我所說的find_all_anagrams函數:

fin = open ('words.txt') 
print find_all_anagrams(fin) 

第一循環結束後程序停止,只是給了我

{('a', 'a'): ['aa']} 

爲何不繼續並處理第二行words.txt? btw words.txt文件是Moby Project的一個文件,可以在這裏下載(http://thinkpython.com/code/words.txt

回答

2

當您撥打find_all_anagrams時,它會從文件中讀取第一行。然後它會調用find_anagrams這將讀取文件的其餘部分。當find_all_anagrams中的for循環嘗試從文件中拉出下一行時,沒有更多內容可以讀取,因此它會返回到目前爲止產生的結果。

即使你會改變你的程序,以便find_all_anagrams將從以下行繼續那將是可怕的慢,因爲時間複雜度爲爲O(n^2)。相反,你可以讀取文件一次,並且詞存儲字典,其中關鍵是分類詞和值的單詞列表:

from collections import defaultdict 

def key(word): 
    return ''.join(sorted(word)) 

d = defaultdict(list) 
with open('words.txt') as f: 
    for line in f: 
     line = line.strip() 
     d[key(line)].append(line) 

print d[key('dog')] 

輸出:

['dog', 'god'] 
0

find_all_anagrams(f)內時,傳遞ffind_anagrams(word,f)。在find_anagrams它然後遍歷行上的文件的所有行for line in t:

當它返回到find_all_anagrams時,它已經讀取整個文件,並且沒有什麼可以讀取。

+0

它看起來像這樣工作。但奇怪的是,find_anagrams函數在沒有readlines方法的情況下可以完美地工作。這是爲什麼? –