web-dev-qa-db-ja.com

リストと文字列で一致する単語を検索する

Pythonでコードを書いていますが、単語のリストが長い文字列に含まれているかどうかを確認したいのですが、何度も繰り返すことができますが、同じことかもしれませんが、それを行うためのより速い方法があるかどうかをtpに確認したかった私が現在行っているのはこれです:

    all_text = 'some rather long string'
    if "motorcycle" in all_text or 'bike' in all_text or 'cycle' in all_text or 'dirtbike' in all_text:
        print 'found one of em'

しかし、私がやりたいのはこれです:

keyword_list = ['motorcycle', 'bike', 'cycle', 'dirtbike']
if item in keyword_list in all_text:
            print 'found one of em'

これを効率的に行う方法はありますか?私は私ができることを理解しています:

keyword_list = ['motorcycle', 'bike', 'cycle', 'dirtbike']
for item in keyword_list:
      if item in all_text:
            print 'found one of em'

しかし、キーワードリストが長くなればもっと良い方法があるようです。

5
clifgray

少なくとも1つがテキストに含まれていることがわかるまで、それらすべてをチェックする必要がありますが、より簡潔にすることができます。

keyword_list = ['motorcycle', 'bike', 'cycle', 'dirtbike']

if any(Word in all_text for Word in keyword_list):
    print 'found one of em'
15
Pavel Anossov

1つの方法は、キーワードリストから プレフィックスツリー を構築することです。次に、文字ごとに長い文字列文字を反復処理できます。各反復で、プレフィックスツリーで現在の位置から始まる大きな文字列のプレフィックスを見つけようとします。この操作にはO(log k)時間がかかります。ここで、キーワードリストのサイズはkです(プレフィックスツリーのバランスが取れていると仮定)。長い文字列の長さがnの場合、全体的な複雑さはO(n log k)だけです。これは、kが大きい場合の単純なO(n k)よりもはるかに優れています。

5
Petar Ivanov

これはどう。

>>> keyword_list = ['motorcycle', 'bike', 'cycle', 'dirtbike', "long"]
>>> all_text = 'some rather long string'
>>> if set(keyword_list).intersection(all_text.split()):
...     print "Found One"
Found One
4
Rakesh

正規表現を使用するのがおそらく速い方法です。

re.findall(r'motorcycle|bike|cycle|dirtbike', text)

選択した単語のすべての一致を返します。

2
Shawn

all_textを変数にする必要があります。そうしないと、機能しません。

keyword_list = ['motorcycle', 'bike', 'cycle', 'dirtbike']
all_text = input("what kind of bike do you like?")
for item in keyword_list:
      if item in all_text:
            print ('found one of em')
1
Luka Styles