testing if a list contains a sublist

Neil Cerutti neilc at norwich.edu
Tue Aug 16 13:45:15 EDT 2011


On 2011-08-16, nn <pruebauno at latinmail.com> wrote:
> That can be easily fixed:
>
>>>> def sublist(lst1, lst2):
> 	s1 = ','.join(map(str, lst1))
> 	s2 = ','.join(map(str, lst2))
> 	return False if s2.find(s1)==-1 else True
>
>>>> sublist([1,2,3],[1,2,3,4,5])
> True
>>>> sublist([1,2,2],[1,2,3,4,5])
> False
>>>> sublist([1,2,3],[1,3,5,7])
> False
>>>> sublist([12],[1,2])
> False
>>>>

String conversion is risky:

>>> sublist(['1,2', '3,4'], [1, 2, 3, 4])
True

Since we're bike-shedding, here's my entry. It's not clear to me
if accepting iterables rather than lists is a win, but I thought,
"Why not be general if the implementation is easy?"

def is_subseq_of(x, y):
    r"""Return True if the elements in iterable x are found contiguously in
    iterable y.

    >>> is_subseq_of([], [])
    True
    >>> is_subseq_of([], [1, 2, 3])
    True
    >>> is_subseq_of([1], [1, 2, 3])
    True
    >>> is_subseq_of([1], [])
    False
    >>> is_subseq_of([4, 5], [1, 2, 3, 4, 5])
    True
    >>> is_subseq_of([1, 2], [1, 3, 2])
    False
    >>> is_subseq_of([2, 3], [1, 2, 3, 4])
    True
    >>> is_subseq_of([1, 2, 2], [1, 2, 3, 4, 5])
    False
    >>> is_subseq_of([1, 2], [1, 2])
    True
    >>> is_subseq_of([1, 2, 3], [1, 2])
    False
    >>> is_subseq_of(['1,2', '3,4'], [1, 2, 3, 4])
    False
    """
    x = tuple(x)
    ix = 0
    lenx = len(x)
    if lenx == 0:
        return True
    for elem in y:
        if x[ix] == elem:
            ix += 1
        else:
            ix = 0
        if ix == lenx:
            return True
    return False

if __name__ == '__main__':
    import doctest
    doctest.testmod()

-- 
Neil Cerutti



More information about the Python-list mailing list