Test if list contains another list

gauravatnet at gmail.com gauravatnet at gmail.com
Thu Sep 18 06:24:16 EDT 2008


On Sep 9, 9:09 pm, "J. Cliff Dyer" <j... at sdf.lonestar.org> wrote:
> On Tue, 2008-09-09 at 10:49 +0200, Bruno Desthuilliers wrote:
> > Matimus a écrit :
> > > On Sep 8, 12:32 am, Bruno Desthuilliers
> > > <bdesth.quelquech... at free.quelquepart.fr> wrote:
> > (snip)
> > >>  >>> set(a).issubset(set(b))
> > >> True
>
> > > Just to clarify, doing it using sets is not going to preserve order OR
> > > number of elements that are the same.
>
> > > That is:
>
> > >>>> a = [1,1,2,3,4]
> > >>>> b = [4,5,3,7,2,6,1]
> > >>>> set(a).issubset(set(b))
> > > True
>
> > > This will return True if b contains at least on of each element found
> > > in a. If the OP wanted to check that list `a` appeared in order
> > > somewhere in list `b` then sets won't work.
>
> > Indeed, and I should have mentionned this myself. Thanks for this reminder.
>
> If preserving order is important, strings have many of the properties
> you're looking for, but it might take some work to figure out a suitable
> way to convert to a string.  The problem is easier if you know something
> about the inputs.  If all inputs are known to be numbers between 0 and
> 15, you can just do:
>
> if ''.join(map(hex, a)) in ''.join(map(hex, b)):
>     return True
>
> Hmm... actually, with the '0x' prefix that hex() puts on numbers, I
> think this works for arbitrary integers.
>
> Cheers,
> Cliff

Hi,

I looked inside this thread for my query which brought me the
following google search result
"Test if list contains another list - comp.lang.python | Google
Groups"

But then I was disappointed to see the question asked was not exactly
right. Other programmers have already answered to the main question.
But what if you actually have to find out if a list has all its
element inside another list in the same order. For that I wrote the
code and that's what I came up with.. let me know if there are any
bugs in this code.

#!C:\Python24

def findAllMatchingList(mainList, subList):
    resultIndex = []
    globalIndex = 0
    for i in range(len(mainList)):
        if i < globalIndex:
            continue
        globalIndex = i
        increment = 0
        for j in range(len(subList)):
            if mainList[globalIndex] == subList[j]:
                globalIndex += 1
                increment += 1
                if j == (len(subList)-1):
                    resultIndex.append(globalIndex-increment)
            else:
                break

    return resultIndex

if __name__ == "__main__":
    #Test case
    mL = [ 'a', 'b', 'c', 1, 2, 4, 1, 2, 1, 1, 1, 2, 9, 1, 1, 1, 2, 3,
'a', 1, 2, 3, 4 ];
    #mL = [ 'a', 'a', 'b', 1 ,2 ,3, 5, 6]
    sL = [ 1, 2, 3 ]
    result = findList( mL, sL )
    for i in result:
        print str(i)

Regards,
Gaurav.



More information about the Python-list mailing list