在一个字符串列表中搜索另一个列表的子字符串
给定这三组数据列表和一个关键词列表:
good_data1 = ['hello, world', 'hey, world']
good_data2 = ['hey, man', 'whats up']
bad_data = ['hi, earth', 'sup, planet']
keywords = ['world', 'he']
我想写一个简单的函数,检查这些关键词是否出现在数据列表中的任何单词里。如果关键词在good_data
列表中的某个单词里出现,就返回True;如果在bad_data
列表中出现,就返回False。
我知道有一种看起来效率不高的方法可以做到这一点:
def checkData(data):
for s in data:
for k in keywords:
if k in s:
return True
return False
5 个回答
4
如果你有很多关键词,可能想试试后缀树。你可以把三个数据列表里的所有单词都放进去,并在每个单词的结束节点上记录它来自哪个列表。这样,你就可以非常快速地在树上查询每个关键词。
注意:后缀树的实现非常复杂!
38
你在寻找
any( k in s for k in keywords )
这种写法更简洁,但可能效率会稍微低一些。
16
在你的例子中,项目数量少的时候,这其实没什么大不了的。但如果你有几千个项目的列表,这个方法可能会有帮助。
因为你并不在乎列表中的哪个元素包含关键词,所以可以一次性扫描整个列表(当作一个字符串)而不是一个一个地检查。为此,你需要一个连接字符,这个字符在关键词中不会出现,这样就可以避免误判。我在这个例子中使用了换行符。
def check_data(data):
s = "\n".join(data);
for k in keywords:
if k in s:
return True
return False
在我完全不科学的测试中,我的版本在大约30秒内检查了5000个项目100000次。我在你的版本运行了3分钟后就停了——等得有点烦了,没耐心再等下去了 =)