在字符串列表中搜索来自另一个lis的任何子字符串

2024-04-24 10:39:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Tags: 数据infalsetrue列表forworlddata
3条回答

在你的例子中,项目太少,这并不重要。但如果你有几千件物品的清单,这可能会有帮助。

由于您不关心列表中的哪个元素包含关键字,因此可以一次扫描整个列表(作为一个字符串),而不是一次扫描一个项。为此,您需要知道不会出现在关键字中的连接字符,以避免误报。我在这个例子中使用换行符。

def check_data(data):
    s = "\n".join(data);
    for k in keywords:
        if k in s:
            return True

    return False

在我完全不科学的测试中,我的版本在大约30秒内检查了5000个项目100000次。我在3分钟后停止了你的版本--厌倦了等待发布=)

如果您有许多关键字,您可能需要尝试后缀树[1]。插入三个数据列表中的所有单词,存储每个单词在其终止节点中来自哪个列表。然后您可以在树上对每个关键字执行查询,非常非常快。

警告:后缀树的实现非常复杂!

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

你在找

any( k in s for k in keywords )

它更紧凑,但效率可能更低。

相关问题 更多 >