2017-03-03 180 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方法的情况下可以完美地工作。这是为什么? –