哪种方法是搜索一个字符串是否包含另一个基于列表的字符串的最快方法?
这很好用,但是当字符串很大且列表很长时,对于我来说太慢了。
ERROR: syntax error at or near "a"
LINE 1: a SELECT 1, 'string_literal';
^
答案 0 :(得分:8)
为此,我建议首先使用RegexpTokenizer
对字符串进行标记以删除所有特殊字符,然后使用sets
查找交集:
from nltk.tokenize import RegexpTokenizer
test_string = "Hello! This is a test. I love to eat apples."
tokenizer = RegexpTokenizer(r'\w+')
test_set = set(tokenizer.tokenize(test_string))
# {'Hello', 'I', 'This', 'a', 'apples', 'eat', 'is', 'love', 'test', 'to'}
将字符串标记化并构造一个集合,找到set.intersection
:
set(['apples', 'oranges', 'bananas']) & test_set
# {'apples'}
答案 1 :(得分:2)
是的。您可以像这样减少迭代次数:
print(any(fruit in frozenset(test_string.replace('.',' ').lower().split()) for fruit in fruits))
答案 2 :(得分:1)
使用in
运算符时,设置可能是提高速度的最佳选择。
要构建仅包含单词的集合,我们需要:
1)从字符串中删除标点符号;
2)将字符串分割为空格。
要消除标点符号,this answer可能是最快的解决方案(使用str.makestrans
和string.punctuation
)。
以下是使用您的测试用例的示例:
import string
test_string = "Hello! This is a test. I love to eat apples."
test_string_no_punctuation = test_string.translate(str.maketrans('', '', string.punctuation))
word_set = set(test_string_no_punctuation.split())
fruits = ['apples', 'oranges', 'bananas']
for fruit in fruits:
if fruit in word_set:
print(fruit+" contains in the string")
您可能需要包装删除标点符号+将字符串拆分为函数的详细操作:
def word_set(input_string):
return set(input_string.translate(str.maketrans('', '', string.punctuation)).split())
答案 3 :(得分:1)
文本通常大于您要搜索的单词列表。
for fruit in fruits:
if fruit in test_string:
print(fruit+" contains in the string")
这实际上是低效的,因为您实际上是遍历水果列表中每个水果的全文,对于短句子来说可能不是问题,但是如果您要搜索长文本,则此过程将花费更长的时间。
一种更好的方法是遍历文本一次,并捕获沿途结果列表中的所有单词。
答案 4 :(得分:0)
如果您只对单词是否存在感兴趣:
>>> words = set(test_string.replace('.',' ').lower().split())
>>> any(fruit in words for fruit in fruits)
True
您当然可以在每个水果上循环以检查在水果蛋糕中可以找到哪些水果。因此,您可以在循环示例中将if fruit in test_string
更改为if fruit in words
。
答案 5 :(得分:0)
您可以执行以下操作:
import re
fruits = ['apples', 'oranges', 'bananas']
test_string = "Hello! This is a test. I love to eat apples."
basket = set(fruits)
words = re.compile('\w+')
for match in words.finditer(test_string):
fruit = match.group()
if fruit in basket:
print(fruit + " contains in the string")
输出
apples contains in the string