Sebastian Linke added the comment:

@Josh
What is the point of using iterators here? If the user wants an iterator to be 
checked then he can throw that iterator right away because it was exhausted by 
the function. I think that in most cases the user wants to do some 
postprocessing on a hairstack after being checked. This is why I restricted the 
arguments to be sequences.

Keeping that restriction in mind a pure Python implementation could look like 
this:

def has_subsequence(seq, subseq):
    if not subseq:
        return True
    if len(subseq) > len(seq):
        return False
    start = 0
    while True:
        try:
            start = seq.index(subseq[0], start)
        except ValueError:
            # seq.index() did not match
            return False
        stop = start + len(subseq)
        if seq[stop - 1] == subseq[-1] and seq[start:stop] == subseq:
            return True
        start += 1

Unfortunately, this version potentially creates lots of subseqences for 
checking equality with the `subseq` argument. I tried to minimise the 
occurrence of those cases by pre-checking the first and the last element of a 
candidate. Anyway, this seems to be faster for small needles compared to your 
`deque`-based suggestion.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue25898>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to