2017-03-25 6 views
0

ランダムな文字列を生成してリストに入れ、ifループを使ってそれらの文字列を実行するプログラムを作成しています。彼らは本当の言葉であるかどうかではない。ループはこのようなものです:python 3で正確なキーワード検索機能を作成する方法

wordvalidator = open("englishwords.txt", "r") 
for line in wordvalidator: 
    for item in stringslist: 
     if item in line: 
      words.append(item) 

それはランダムな文字列を検証するためのもので、「englishwords.txt」の言葉の多くを持つファイルであることと実際の言葉、「stringslist」明らかに文字列でリストされ、実際の単語であることが確認された文字列が属する「単語」がリストになります。問題は、たとえば文字列が1つの場合、「ird」と言いましょう。これは実際の単語ではなく、すべての単語を検索して「鳥」と突き合わせます。これらの文字列が今の単語であるかどうかを真に検証する方法がわからないので、これは問題です。私は何をすべきかわからない、 "if item in line"を "if item is line"と置き換えることを除いて、文字列が文書の行に完全に対応していれば条件が真となるように修正する"is"が実際のPython用語であるかどうかわかりませんが、他に何が同様に使用できるかわかりません。どんな助けもありがとう。ありがとう。

+0

大文字と小文字が混在している場合は、 'str.upper'もすべての場合があります。 – tdelaney

+1

'wordvalidator'では1行に1単語しかありませんか?もしそうなら、 'str.strip()'と '==' - 'item if == line.strip():'を使うことができます。 1行に複数の単語がある場合は、その行を 'str.split()'する必要があります。 'item:line.strip()。split():' – AChampion

+0

@tdelaneyその目的のためにファイルが完全に大文字である –

答えて

1
with open("englishwords.txt") as wordvalidator: 
    validset = set(map(str.strip, wordvalidator)) 

words = [word for word in stringslist if word in validset] 

基本的には、高速メンバーシップのテスト(if word in validset)を行いますので、setを使用し、それはあなたがしたくない検索をサブストリングないため、文字列が等しいかどうかを確認するためにinを使用しないでください。

+0

str.stripは、1行に1語があれば動作します。 're.findall(r '[^ \ W \ d _] +'、wordvalidator.read())'は、行ごとに複数の単語を扱います。 – tdelaney

+0

'' re'に頼ることなく、 '{line.strip()。split()}'の中のwordvalidatorの行のための単語。しかしこれは、ファイル全体をメモリに読み込まなければならないという副作用と、この行を単に行単位で処理しているOPとの違いがあります。 – AChampion

+0

ありがとうございました。 –

関連する問題