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

9 投票
6 回答
111751 浏览
提问于 2025-04-17 15:13

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

撰写回答