You can use a rolling window iterator, in this case one from an old version of the itertools
docs:
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]))
If you only need it to work on lists, not any iterable, you can use:
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))
A basic implementation of the method mentioned by 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]))
The advantage of this method is that it doesn't have to slice for every index up to the first match, just for indexes corresponding to matches for the first value in the segment.