0

我有一个包含单词列表的文件,我正在尝试逐行查找单词阅读。common_words 文件的示例是:

yourself
yourselves
z
zero

该列表按字典顺序排序。

def isCommonWord(word):

    commonWordList = open("common_words", 'r')
    commonWord = commonWordList.readline()
    commonWord = commonWord.rstrip("\n")

    while commonWord <= word:
        if commonWord == word:
            return True 
        commonWord =  commonWordList.readline()
        commonWord = commonWord.rstrip("\n")

    return False

if isCommonWord("zeros"):
    print "true"
else:
    print "false"

现在这个函数进入了一个无限循环。我不知道这是怎么回事。任何帮助将不胜感激。如果我尝试除“零”之外的其他变量,那么它工作得很好。只有“零”我才会遇到麻烦。感谢您的时间。

4

6 回答 6

3

问题是它zeros会出现你文件中的最后一个单词之后——但你不检查这个。此外,readline()如果您已到达文件末尾,只会给您一个空字符串,因此循环只会一直认为“还没有”并永远持续下去。

顺便说一句,有更好的方法来做到这一点,利用列表已排序的事实:看看二分搜索

事实上,如果您有大量可用内存,您甚至可以做得更好:只需将整个文件读入一个大文件set,然后检查成员资格需要持续的时间!

于 2012-04-20T09:46:06.540 回答
2

readline当您尝试读取文件末尾时将返回空字符串,并且空字符串会比较''任何单词,因此如果您要查找的>单词是文件中的任何单词,则您的循环条件始终为真。

这可以通过将循环重写为来解决

def isCommonWord(word):
    with open("common_words") as f:
        for w in f:
            w = w.rstrip()
            if w == word:
                return True
            elif w > word:
                break

    return False

尽管问题的真正解决方案是读取文件一次并从中构建set

common = set(ln.rstrip() for ln in open("common_words"))
print("true" if "zeros" in common else "false")
于 2012-04-20T09:45:05.913 回答
1

最有可能的"zeros"是,在您的文件 common_words 中的所有单词后面,因此没有匹配项。当输入文件的 EOF 时,commonWord(您使用 阅读<fobj>.readline())将为空(""),并且空字符串(返回“永远”)小于“零”,因此您的循环条件永远不会终止。

将循环条件更改为:

while commonWord and commonWord <= word:
    ...
于 2012-04-20T09:45:23.053 回答
1

因为"yourself"<="zeros"条件为真,while 循环将无限继续。

因此,如果将任何lexicographically大于其他单词的单词传递给该函数,那么您的程序将进入无限循环。例如。for "zz" "yourself"<="zz" 将陷入无限循环,因为zzlexicographically比文件中的所有其他单词都大common_words

更好的版本isCommonword()将是:

def isCommonWord(word):

    commonWordList = open("common_words.txt")
    commonWord = [x.rstrip() for x in commonWordList]
    if word in commonWord:
        return True
    else:return False
于 2012-04-20T09:56:15.860 回答
0

如果找不到单词并且在文件中的最后一个单词之后按字典顺序排列,您还没有添加循环退出的方法。“零”在文件中,但不是“零”

可以工作的 while 循环的相当直接的翻译可能是

for commonWord in commonWordList:
    commonWord = commonWord.rstrip("\n")
    if commonWord <= word:
        break
    elif commonWord == word:
        return True 
return False

到达文件末尾时,for循环自动终止

于 2012-04-20T09:45:44.637 回答
0

问题可能与您的情况有关commonWord <= word。尝试使用!=并检查 readline 是否正在返回某些内容。如果单词在列表中,则返回 true,如果不是,则打破循环:)

于 2012-04-20T09:47:11.107 回答