2012-02-26 7 views
0

私は、別のプログラムの大部分として、単語エントリがテキストファイル内にあるかどうかを調べる関数を持っています。テキストファイルは次のようになりますのであれば:Pythonで部分集合を持たない長い集合から単語全体を完全に一致させる必要があります

aardvark 
aardvark's 
aardvarks 
abaci 
. 
. 
. 
zygotes 

声明

infile = open("words","r") # Words is the file with all the words. . . yeah. 
text = infile.read() 

if word in text: 
    return 1 
else: 
    return 0 

作品、ソートの場合、私はちょうど迅速に走りました。問題はaardvarkに対してtrueを返しますが、wj; ekに対してfalseを返しますが、どの単語のSUBSETでもtrueを返します。たとえば、単語rdvaはaardvarkのサブセットとしてファイル内にあるため、単語として戻ってきます。私は言葉だけにマッチする必要があり、私はかなり困惑しています。

どうすれば単語全体(ここでは行全体に相当)に一致させることも、何も一致させることもできますか?

この質問が他の場所で回答された場合、私は謝罪します。

多くのありがとうございます!

答えて

2

各行を反復して行全体が一致するかどうか:

def in_dictionary(word): 
    for line in open('words', 'r').readlines(): 
    if word == line.strip(): 
     return True 

    return False 
  • をあなたはinステートメントを使用するときは、基本的に単語がの行であるかどうかを尋ねています。
  • ==を使用すると、行全体が一致します。
  • .strip()hello等しくない{space}hello
+0

これは巧妙であり、私はそれを使用したいが、ループのない言葉で、文字でファイルを通過しています。 。 。どのように私はそれが壊れて指定することができますか?文字ではなくリターンで? – Terrik

+0

私の悪いです。今すぐ試してください(最後に '.readlines()'があります)。 – Blender

+0

素晴らしい、多くのありがとうBlender!完璧に働いた。 – Terrik

0

にBlenderの答えは動作しますが、ここで自分自身を反復するためにあなたを必要としない別の方法で引き起こされる、先頭と末尾の空白を削除します。

各行を改行文字(\n)で終了します。だから、比較するときにあなたのチェックした文字列の前後に\nを置くことができます。したがって、このような何か:

infile = open("words","r") # Words is the file with all the words. . . yeah. 
text = "\n" + infile.read()  # add a newline before the file contents so we can check the first line 

if "\n"+word+"\n" in text: 
    return 1 
else: 
    return 0 

は、しかし、気をつけて - あなたの行末はあまりに\r\nまたはちょうど\rかもしれません。

チェックしている単語に改行が含まれていると、問題が発生することもあります。 Blenderの答えが良いです。

+1

通常の単語に改行が含まれているとは思わない;) – Blender

+0

あなたは自分の小切手を自分の機能に与えるときに、その可能性から守っていると思っています。 – chroipahtz

1

もっと簡単な方法があります。あなたのファイルは、概念的に言えば単語のリストなので、(単一の文字列の代わりに)その単語のリストを構築してください。

with open("words") as infile: words = infile.read().split() 
return word in words 

<string> in <string>部分文字列検索を行いますが、会員のための<anything> in <list>チェック。同じ単語リストに対して複数回チェックする場合は、代わりにsetという単語を格納することでパフォーマンスを向上させることができます(リストをsetコンストラクタに渡すだけです)。

0

これは、そのリストを使用して長いテキストのすべての単語を確認するまでは素晴らしいことです。私と/usr/share/dict/wordsの場合は、をチェックするのに3msかかる。ですから、代わりに辞書を使うことをお勧めします。ルックアップは、約2500倍高速だった:

words = {} 
for word in open('words', 'r').readlines(): 
    words[word.strip()] = True 

def find(word): 
    return word in words 
関連する問題