python - 如何更快地从列表中删除包含某些单词的字符串
问题描述
有一个句子列表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 个单词的词典。应用提到的列表理解需要几个小时!因此,我正在寻找一种更快的方法来从包含另一个列表中的单词的列表中删除字符串。有什么建议么?也许使用正则表达式?
解决方案
在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))]
推荐阅读
- delphi - TButton 和 TBitBtn,继承和 ImageList 支持
- javascript - 根据屏幕大小显示不同的按钮
- r - In R, converted factor variables to numeric don't show as such and recoding Likert scale doesn't work. Why is this?
- javascript - 为什么 GSAP 输入不透明动画无法正常工作?
- c++ - C++ Visual Studio Community 2019 SFML 链接快捷方式
- raku - 乐和杯子GetDests
- c# - 使用文本或图像保存原始剪贴板,稍后在 C# 中恢复
- pandas - KeyError:“[Index(['Company'], dtype='object')] 均不在 [columns] 中”
- ruby - 从网页抓取 ASCII 艺术作品的问题
- python - 在 Django(3.1) 中添加指向另一个页面的链接 (NoReverseMatch)