是否有一种简单的方法来搜索列表中的字符串序列?例如:
testlist = [a,b,c,d,e,f,g,a,b,c,d,j,k,j]
,我想搜索序列abc
并返回索引。因此,要弄清楚我要搜索的字符串是否包含列表中的多个元素。在某些情况下:我有一个包含数据块的列表,我想找出每个数据块在列表中搜索一个重复出现的字符串的大小。
答案 0 :(得分:2)
好的string search algorithms有很多:KMP,Boyer-Moore和Rabin-Karp。如果您要处理字符,可以使用str.index
上的内置''.join(L)
函数(str.index
在CPython中实现了Boyer-Moore算法:https://github.com/python/cpython/blob/3.7/Objects/stringlib/fastsearch.h)。
但是在大多数情况下,朴素的算法已经足够好了。检查haystack
的每个索引以找到needle
:
>>> a, b, c, d, e, f, g, j, k = [object() for _ in range(9)]
>>> haystack = [a, b, c, d, e, f, g, a, b, c, d, j, k, j]
>>> needle = [a, b, c]
>>> for i in range(len(haystack)-len(needle)+1):
... if haystack[i:i+len(needle)] == needle:
... print(i)
...
0
7
复杂度为O(| haystack | * | needle |)。