我有一个包含单词列表的文件,我正在尝试逐行查找单词。 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"
现在这个函数进入无限循环。我不知道这是怎么回事。任何帮助将不胜感激。 如果我尝试除“零”之外的其他变量,那么它的效果非常好。只有“零”,我才会遇到麻烦。谢谢你的时间。
答案 0 :(得分:3)
问题是zeros
会在文件中的最后一个单词后出现 - 但是你不会检查这个。此外,如果你到达文件的末尾,readline()
将只给你一个空字符串,所以循环只是一直在思考“还没有”并且永远地去。
顺便说一句,有更好的方法可以做到这一点,使用列表排序的事实:看看二进制搜索。
事实上,如果你有足够的内存可以做得更好:只需将整个文件读入一个大的set
,然后需要一段时间来检查会员资格!
答案 1 :(得分:2)
readline
将返回空字符串,空字符串会比较''
任何单词,因此如果单词'',则循环条件始终为true重新查找文件中的任何单词>
。
这可以通过将循环重写为
来解决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")
答案 2 :(得分:1)
最有可能的是,"zeros"
位于文件common_words中的所有单词后面,因此无法匹配。当你输入文件的EOF时,commonWord(你用<fobj>.readline()
读的)将为空(""
),而空字符串(“永久”返回)小于“零”,所以你的循环条件永远不会终止。
将循环条件更改为:
while commonWord and commonWord <= word:
...
答案 3 :(得分:1)
对于"yourself"<="zeros"
,条件为真,而循环将无限延续。
所以,如果将任何单词传递给比其他单词大lexicographically
的函数,则程序将进入无限循环。
例如。 "zz"
“你自己”&lt; =“zz”会遇到一个无限循环,因为zz
比文件lexicographically
中的所有其他单词都大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
答案 4 :(得分:0)
如果找不到单词并且在文件中的最后一个单词后面以字符形式显示,则没有为循环添加循环的方法。 “零”在文件中,但不是“零”
你的while循环的相当直接的翻译可能是
for commonWord in commonWordList:
commonWord = commonWord.rstrip("\n")
if commonWord <= word:
break
elif commonWord == word:
return True
return False
当到达文件末尾时,for循环自动终止
答案 5 :(得分:0)
问题可能出在您的情况commonWord <= word
上。尝试使用!=
并检查readline是否返回了某些内容。如果单词在列表中,则返回true,如果不是什么都没有打破循环:)