9

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'

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

4

6 に答える 6

18

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

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

if any(word in all_text for word in keyword_list):
    print 'found one of em'
于 2013-02-08T09:16:49.640 に答える
6

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

于 2013-02-08T09:19:29.437 に答える
6

これはどう。

>>> 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
于 2013-02-08T09:41:50.753 に答える
2

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')
于 2016-11-10T09:39:24.383 に答える