0

単語のリストを含むファイルがあり、1行ずつ単語を読んでいる単語を探しています。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ファイルの終わりを超えて読み込もうとすると空の文字列が返され、空の文字列は''任意の単語を比較するため、探して>いる単語がファイル内のいずれかの単語である場合、ループ条件は常に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

この問題の本当の解決策は、ファイルを1回読み取り、それからビルドする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内のすべての単語の背後にあるため、一致するものはありません。commonWord(で読み取る<fobj>.readline())は、入力ファイルのEOFに達すると空("")になり、空の文字列(「永久に」返される)は「ゼロ」よりも小さいため、ループ条件が終了することはありません。

ループ条件を次のように変更します。

while commonWord and commonWord <= word:
    ...
于 2012-04-20T09:45:23.053 に答える
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 に答える