我正在用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'
但是一旦关键字列表变长,似乎会有更好的方法。
答案 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)