检查列表中的任何子字符串是否在另一个字符串列表中的最有效方法

时间:2015-02-03 17:16:54

标签: python set

我有两个列表,一个是单词,另一个是字符组合。仅返回与列表中的任何内容不匹配的组合的最快方法是什么?

我试图尽可能地简化它,但是当它使用3个字符进行组合时它仍然很慢(4个字符最多可达290秒,甚至不会尝试5个字符) )

这是一些示例代码,目前我将所有单词转换为列表,然后在字符串中搜索每个列表值。

#Sample of stuff
allCombinations = ["a","aa","ab","ac","ad"]
allWords = ["testing", "accurate" ]

#Do the calculations
allWordsJoined = ",".join( allWords )
invalidCombinations = set( i for i in allCombinations if i not in allWordsJoined )

print invalidCombinations
#Result: set(['aa', 'ab', 'ad'])

我只是好奇是否有更好的方法可以用套装做到这一点?通过3个字母的组合,有18278个列表项可供搜索,4个字母可达到475254,所以目前我的方法还不够快,特别是当单词列表字符串大约为100万时字符。

如果你需要整个字符串,

Set.intersection似乎是一个非常有用的方法,所以肯定必须有类似搜索子字符串的东西。

2 个答案:

答案 0 :(得分:1)

首先想到的是,您可以通过检查已经"无效"的组合来优化查找。即如果 ab 无效, ab。?也将无效,并且无法检查此类内容。

还有一件事:尝试使用

for i in allCombinations:
    if i not in allWordsJoined:
        invalidCombinations.add(i)

而不是

invalidCombinations = set(i for i in allCombinations if i not in allWordsJoined)

我不确定,但较少的内存分配对于实际数据运行来说可能是一个很小的推动。

答案 1 :(得分:0)

查看集合是否包含项目是O(1)。你仍然需要遍历你的组合列表(有一些例外。如果你的话没有" a"它不会有任何其他包含&#34的组合; a"。你可以使用一些类似树的数据结构来与你原来的单词组进行比较。

你不应该将你的单词列表转换为字符串,而应该是一组。你应该得到O(N),其中N是你的组合的长度。

另外,我喜欢Python,但它并不是最快的语言。如果这是您需要完成的唯一任务,并且需要非常快,并且您无法改进算法,则可能需要查看其他语言。您应该能够非常轻松地对某些内容进行原型设计,以了解不同语言的速度差异。