我尝试编写一个python脚本,在txt文件(英文字典)中搜索anagrams。我有这三个功能:
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)
答案 0 :(得分:2)
当您致电find_anagrams
时,它会从文件中读取第一行。然后它将调用for
,它将读取文件的其余部分。当find_all_anagrams
中的find_all_anagrams
循环尝试从文件中提取下一行时,没有什么可读的,所以它返回到目前为止生成的结果。
即使你改变你的程序以便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')]
从下一行继续,它也会非常缓慢,因为时间复杂度 O(n ^ 2)。相反,你可以读取文件一次并将单词存储到字典中,其中key是排序单词,value是单词列表:
['dog', 'god']
输出:
b: List[Long] <- map1.get(a).toList
答案 1 :(得分:0)
从f
开始,您将find_anagrams(word,f)
传递给find_anagrams
。在for line in t:
中,它会遍历行-vv
当它返回find_all_anagrams时,它已经读取了整个文件,并且没有任何东西可供阅读。