2017-03-03 14 views
0

私はanagramsのためのtxtファイル(英語辞書)を検索するpythonスクリプトを書こうとします。私はfind_all_anagrams関数を呼び出す場合python for-loopが実行されていません

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 

:私はこれらの3つの機能を持っている

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

プログラムは、最初のループの後に停止し、それをしない理由だけで

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

が私に与えます続けてwords.txtの2行目を処理しますか? Btw words.txtファイルはMoby Projectのもので、ここからダウンロードできます(http://thinkpython.com/code/words.txt

答えて

2

find_all_anagramsに電話するとファイルから最初の行が読み込まれます。その後、find_anagramsが呼び出され、残りのファイルが読み込まれます。 ループのfind_all_anagramsがファイルから次の行を引っ張ろうとすると、何も読み込めませんので、これまで生成された結果が返されます。

find_all_anagramsが次の行から継続するようにプログラムを変更しても、時間の複雑さがO(n^2)であるため、ひどく遅くなります。あなたがfを渡すfind_all_anagrams(f)内から

['dog', 'god'] 
0

に出力を

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')] 
:代わりに、一度ファイルを読み込み、キーがソートされた言葉であり、値が単語のリストである辞書に単語を保存することができ〜 find_anagrams(word,f)find_anagramsの場合、ファイルの行全体を繰り返し処理します。 for line in t:

find_all_anagramsに戻ってくると、既にファイル全体が読み込まれており、読み込めることはありません。

+0

このように動作するようです。しかし、不思議なことに、find_anagrams関数はreadlinesメソッドと完全に機能します。何故ですか? –