Python:列表中的完整字符串与部分字符串的交集

时间:2013-01-17 22:07:43

标签: python list intersection

假设我有一个字符串和一个字符串列表:

a = 'ABCDEFG'

b = ['ABC', 'QRS', 'AHQ']

如何拉出列表b中与字符串a的一部分完美匹配的字符串?所以返回将是['ABC']

最重要的问题是我有数千万字符串,因此时间效率至关重要。

5 个答案:

答案 0 :(得分:4)

如果你只想要b中的第一场比赛:

next((s for s in b if s in a), None)

一旦找到匹配就具有短路的优势,而其他列表解决方案将继续进行。如果未找到匹配项,则会返回None

答案 1 :(得分:1)

请记住,Python的子字符串搜索x in a已经针对一般情况进行了优化(并且在C中编译为CPython),因此您不太可能在一般情况下优先考虑它,特别是对于纯Python代码

但是,如果你有一个更专业的案例,你可以做得更好。

例如,如果你有一个数百万字符串b的任意列表,所有字符串都需要在一个永不改变的巨大静态字符串a中进行搜索,那么预处理a就可以了一个巨大的差异。 (请注意,这与通常情况相反,其中预处理模式是关键。)

另一方面,如果您希望不太可能进行匹配,并且您事先获得了整个b列表,那么通过以某种方式组织b可能会获得一些大的收益。例如,如果"ABCD"已经失败,则无需搜索"ABC";如果您需要同时搜索"ABC""ABD",则可以先搜索"AB",然后检查"C""D"后面是否有b不得不重复自己;等等(甚至有可能将所有{{1}}合并到一个足够接近最优的正则表达式中......虽然有数百万个元素,但这可能不是答案。)

但很难提前猜测,没有比你给我们更多的信息,确切地说你想要什么算法。

Wikipedia对字符串搜索算法有很好的高级概述。一般来说还有一个website专门用于模式匹配,这似乎有点过时,但我怀疑你最终还是需要一个在过去3年中发明的算法。

答案 2 :(得分:0)

答案:

(x for x in b if x in a )

这将返回一个生成器,它将是匹配的列表。拿第一个或循环它。

答案 3 :(得分:0)

In [3]: [s for s in b if s in a]
Out[3]: ['ABC']

在我的机器上,b包含20,000,000个元素(使用a进行测试,b包含与问题类似的字符串)时,大约需要3秒。

答案 4 :(得分:0)

您可能需要查看以下算法:

Boyer–Moore string search algorithmwikipedia

但不知道更多,这可能是矫枉过正!