[Tutor] Replace sequence in list - looking for direction

Alan Gauld alan.gauld at btinternet.com
Sat Sep 6 16:10:42 CEST 2008


"peter hodgson" <imputerate at puteracy.com> wrote 

>> for key in b:
>>    keylist = key.split(',')
>>    if keylist < a:
>>        i = a.index(keylist[0])
>>        print a[:i] + [b[key]] + a[i+len(keylist):]
>
> now, i get it, mostly; but keylist being shorter than the list "a"
> 
>>>> keylist < a
> True

This is not testing the length it is testing the contents.

>>> a = ['a','c','e']
>>> b = ['b','d','f']
>>> a<b
True
>>> b<a
False

It sees that 'a' < 'b' so returns True for a<b but
since 'b' is not less than 'a' it returns false for b<a
Now consider more closely aligned examples:

>>> c = ['a','b','c']
>>> c<a
True

Here the a's are equal so it checks the second element 
and finds b < c so c<a is true

Finally for unequal length strings

>>> d = ['a','c']
>>> d<a
True
>>> d<c
False
>>>

So d winds over a since the third element not existing 
is taken to be lower valued than it existing. But the 
character values in d<c a still win out regardless of length.

Does that make sense?

So in the original program

for key in b:
    keylist = key.split(',')
    if keylist < a:
        i = a.index(keylist[0])
        print a[:i] + [b[key]] + a[i+len(keylist):]

It is checking that it will find a valid index in the i assignment.
Having said that I'm not sure the check is fully effective since 
I have a feeling it may fail for duplicated instances of the first 
letter.... But to answer your question the list comparison is 
more complex than just length.

And finally the a{:i]  part is to cover the case where the 
index i is greater than 0. So we retain the initial values up 
to the matching key.

HTH,

-- 
Alan Gauld
Author of the Learn to Program web site
http://www.freenetpages.co.uk/hp/alan.gauld



More information about the Tutor mailing list