9

我正在用 Python 编写一些代码,我想检查一个单词列表是否在一个长字符串中。我知道我可以多次迭代它,这可能是同一件事,但我想看看是否有更快的方法来做到这一点。我目前正在做的是这样的:

    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

您仍然必须至少检查它们,直到找到一个在文本中,但它可以更简洁:

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

一种方法是从关键字列表中构建前缀树。然后您可以遍历每个字符的长字符串字符。在每次迭代中,您都尝试在前缀树中找到从当前位置开始的大字符串中的前缀。此操作需要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 回答
4

使用正则表达式可能是最快的方法。

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

将返回所选单词的所有匹配项。

于 2017-07-09T02:58:10.780 回答
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 回答
0

我发现这个答案在这里真的很有用,它也可以用来搜索子字符串

https://www.askpython.com/python/list/find-string-in-list-python

ls = ['Hello from AskPython', 'Hello', 'Hello boy!', 'Hi']

matches = [match for match in ls if "Hello" in match]

print(matches)
于 2021-08-02T11:18:00.233 回答