在列表和字符串中查找匹配的单词

时间:2013-02-08 09:13:55

标签: python string performance list comparison

我正在用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'

但是一旦关键字列表变长,似乎会有更好的方法。

6 个答案:

答案 0 :(得分:14)

至少在文本中找到一个之前,你仍然需要检查它们,但它可以更简洁:

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

if any(word in all_text for word in keyword_list):
    print 'found one of em'

答案 1 :(得分:4)

一种方法是从关键字列表中构建prefix tree。 然后,您可以遍历每个字符的长字符串字符。 在每次迭代中,您尝试在前缀树中找到从当前位置开始的大字符串中的前缀。此操作需要O(log k)时间,其中关键字列表的大小为k(假设前缀树是平衡的)。 如果长字符串的长度为n,则整体复杂度仅为O(n log k),如果k很大,则比天真O(n k)要好得多。

答案 2 :(得分:4)

这个怎么样。

>>> 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

答案 3 :(得分:1)

你需要将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')

答案 4 :(得分:1)

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

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

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

答案 5 :(得分: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)