在列表和字符串中找到匹配单词
我正在用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 个回答
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
6
一种方法是用关键词列表构建一个前缀树。这样,你就可以逐个字符地遍历长字符串。在每次遍历时,你会尝试在前缀树中查找从当前字符位置开始的长字符串的前缀。这个查找操作的时间复杂度是O(log k)
,其中k是关键词列表的大小(假设前缀树是平衡的)。如果长字符串的长度是n,那么整体的复杂度就是O(n log k)
,这比简单的方法O(n k)
要好很多,特别是当k很大的时候。
18
你还是得检查所有的内容,至少要找到一个在文本中存在的,但这样可以写得更简洁一些:
keyword_list = ['motorcycle', 'bike', 'cycle', 'dirtbike']
if any(word in all_text for word in keyword_list):
print 'found one of em'