在一个字符串列表中搜索另一个列表的子字符串

19 投票
5 回答
36368 浏览
提问于 2025-04-15 11:07

给定这三组数据列表和一个关键词列表:

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

如果你有很多关键词,可能想试试后缀树。你可以把三个数据列表里的所有单词都放进去,并在每个单词的结束节点上记录它来自哪个列表。这样,你就可以非常快速地在树上查询每个关键词。

注意:后缀树的实现非常复杂!

[1] http://en.wikipedia.org/wiki/Suffix_tree

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分钟后就停了——等得有点烦了,没耐心再等下去了 =)

撰写回答