Simple newbie question

Angelo Secchi secchi at sssup.it
Thu Dec 4 15:04:20 EST 2003


Thanks a lot to everybody.
Your points have been very useful. 
Angelo



On Thu, 4 Dec 2003 15:50:45 +0000 (UTC)
Duncan Booth <duncan at NOSPAMrcp.co.uk> wrote:

> Angelo Secchi <secchi at sssup.it> wrote in 
> news:mailman.107.1070547952.16879.python-list at python.org:
> 
> > The code i'm using is the following:
> > 
> > for line in lista:
> >      if sum(line == 0) > 0:
> >      lista.remove(line)
> > 
> > 
> > The problem is that the loop stops at the first line with zeros and
> > it doesn't remove the other lines with zeros (at least if I do not
> > re-run the loop). Probably I do not understand how the loop works.
> 
> The loop will assign the first element of lista to line, then the
> second, then the third, and so on.
> 
> The problem is that, if you remove an element everything after it
> shifts up one place. Say you are looking at the first element and
> remove it, what was the second element now becomes the first element,
> but the next time round the loop you will look at the new second
> element and the one that was originally second (and is now first) will
> be skipped.
> 
> The solution is never to work on the list you are modifying. Just make
> a copy of the list and iterate over the copy, that means you can
> safely modify the original. To copy a list, use the 'list' builtin.
> 
>     for line in list(lista):
>         if condition:
>             lista.remove(line)
> 
> Alternatively turn your brain around and instead of deleting specific 
> elements from the list just build a new list with the elements you
> want to keep. In this case you could do that using a list
> comprehension:
> 
>    lista = [ line for line in lista if not condition ]
> 
> (Obviously in both these cases replace condition with the correct 
> expression, which as Gerhard pointed out may not be the condition in
> your original posting.)
> 
> The list comprehension rebinds the lista variable, whereas your
> original attempt was modifying the list inplace. This might be
> significant if there are other references to the same list elsewhere
> in your code. If it does matter, then you can still use a list
> comprehension to mutate the original list:
> 
>    lista[:] = [ line for line in lista if not condition ]
> 
> Unlike the original 'for' loop, this works by building a complete 
> replacement list then mutating the original list in one go.
>  
> -- 
> Duncan Booth                                            
> duncan at rcp.co.uk int month(char
> *p){return(124864/((p[0]+p[1]-p[2]&0x1f)+1)%12)["\5\x8\3""\6\7\xb\1\x
> 9\xa\2\0\4"];} // Who said my code was obscure?-- 
> http://mail.python.org/mailman/listinfo/python-list





More information about the Python-list mailing list