python for循环没有执行

时间:2017-03-03 03:45:40

标签: python python-2.7

我尝试编写一个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

2 个答案:

答案 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时,它已经读取了整个文件,并且没有任何东西可供阅读。