this is simple...

Maric Michaud maric at aristote.info
Sat Jun 28 00:49:10 EDT 2008


Le Saturday 28 June 2008 06:30:25 ToshiBoy, vous avez écrit :
> I am a newbie... and the first to admit it... but this has me stuffed:
>
> I have two lists A and B that are both defined as range(1,27) I want
> to find the entries that are valid for A = BxB
>
> so here is my code:
>
> A = range(1,27)
> B = range(1,27)
>
> for b in B:
>         if b*b in A:
>             print b
>         else:
>             B.remove(b)
>
> I get, as expected 1,4,9,16,25 printed out being the only members of B
> where the condition is true, but when I print B I get:
>
> [1, 2, 3, 4, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25]
>
> 1 to 5 is correct, but why doesn't the remove method remove 7 and
> above? What am I doing wrong here?
> --
> http://mail.python.org/mailman/listinfo/python-list


This is a frequent error from beginner, you're iterating over a list while 
modifying it, the result is undefined.

The most immediate solution is to use a copy of the list you iterate over :

>>[169]: A = range(1,27)

>>>[170]: B = range(1,27)

>>>[171]: for b in B[:] :
        if b*b in A:
            print b
        else:
            B.remove(b)
   .....:
   .....:
1
2
3
4
5

>>>[176]: B
...[176]: [1, 2, 3, 4, 5]

Note that this can be easily done with the simpler :

B = [ e for e in B if e*e not in A ]

-- 
_____________

Maric Michaud




More information about the Python-list mailing list