您可以使用滚动窗口迭代器,在本例中是来自旧版本的 itertools 文档:
from itertools import islice
def window(seq, n=2):
"Returns a sliding window (of width n) over data from the iterable"
" s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ... "
it = iter(seq)
result = tuple(islice(it, n))
if len(result) == n:
yield result
for elem in it:
result = result[1:] + (elem,)
yield result
def does_segment_exist(iterable, sublist):
return tuple(sublist) in window(iterable, len(sublist))
print(does_segment_exist([1,3,4,5,2], [3,4,5]))
如果您只需要它在列表上工作,而不是任何可迭代的,您可以使用:
def does_segment_exist(seq, sublist):
# seq and sublist must both be lists
n = len(sublist)
return sublist in (seq[i:i+n] for i in range(len(seq) + 1 - n))
Raymond提到的方法的基本实现:
def does_segment_exist(seq, sublist):
first = sublist[0]
i = 0
n = len(sublist)
while True:
try:
i = seq.index(first, i)
except ValueError:
return False
if sublist == seq[i:i+n]:
return True
i += 1
print(does_segment_exist([1,3,4,5,2], [3,4,5]))
这种方法的优点是它不必对每个索引进行切片,直到第一个匹配项,只需对与段中第一个值的匹配项对应的索引进行切片。