假设我有一个字符串和一个字符串列表:
a = 'ABCDEFG'
b = ['ABC', 'QRS', 'AHQ']
如何拉出列表b中与字符串a的一部分完美匹配的字符串?所以返回将是['ABC']
最重要的问题是我有数千万字符串,因此时间效率至关重要。
答案 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)