首页 > 解决方案 > 如何更快地从列表中删除包含某些单词的字符串

问题描述

有一个句子列表sentences = ['Ask the swordsmith', 'He knows everything']。目标是从单词列表中删除那些包含一个单词的句子lexicon = ['word', 'every', 'thing']。这可以使用以下列表推导来实现:

newlist = [sentence for sentence in sentences if not any(word in sentence.split(' ') for word in lexicon)]

请注意,这if not word in sentence不是一个充分条件,因为它还会删除包含嵌入词典中的单词的单词的句子,例如word嵌入在 中swordsmith,并且every嵌入thing在 中everything

但是,我的句子列表包含 1.000.000 个句子和 200.000 个单词的词典。应用提到的列表理解需要几个小时!因此,我正在寻找一种更快的方法来从包含另一个列表中的单词的列表中删除字符串。有什么建议么?也许使用正则表达式?

标签: pythonregexlist-comprehension

解决方案


set. 这使其速度更快,并缓解了包含问题,因为您只在词典中查找整个单词。

lexicon = set(lexicon)
newlist = [s for s in sentences if not any(w in lexicon for w in s.split())]

这是非常有效的,因为w in lexicon它是一个O(1)操作和any短路。主要问题是正确地将您的句子分成单词。正则表达式不可避免地会比自定义解决方案慢,但可能是最佳选择,具体取决于您希望对标点符号等的鲁棒性。例如:

lexicon = set(lexicon)
pattern = re.compile(r'\w+')
newlist = [s for s in sentences if not any(m.group() in lexicon for m in pattern.finditer(s))]

推荐阅读