deleting elements from a list in a for loop

Benjamin Niemann b.niemann at betternet.de
Fri Oct 29 10:45:30 EDT 2004


flupke wrote:
> Hi,
> 
> i'm having trouble with deleting elements from a list in a for loop
> 
> ============== test program ==============
> el = [ "one", "two", "three", "four" ]
> print "**** Start ****"
> print "List = %s " % el
> index = 0
> for line in el:
>     print "    el = %s " % line
>     if ( index == 1 ):
>         print "    deleting %s " % line
>         del el[index]
>     else:
>         index += 1
> print "**** After delete ****"
> print "List = %s " % el
> 
> print "**** After adding two ****"
> el.append("two")
> print "List = %s " % el
> ============== test program ==============
> 
> This is the output that i get
> **** Start ****
> List = ['one', 'two', 'three', 'four']
>     el = one
>     el = two
>     deleting two
>     el = four
>     deleting four
> **** After delete ****
> List = ['one', 'four']
> **** After adding two ****
> List = ['one', 'four', 'two']
> 
> After deleting it doesn't go to element "three". Why is that?
> How can i safely delete from a list?
> The reason is that i'm currently making an application to manage my 
> links. I write a couple of links to the screen in a listbox (wxPython) 
> and thus i delete those links that appear on screen from the list 
> because people will be able to edit them.
> Then when they move to another link section, i write the content of the 
> listbox back to the list. But as i've illustrated in the small example 
> my coding is flawed.
> 
> Thanks,
> Benedict

If it doesn't matter in which order you scan the list:

for idx in xrange(len(el), -1, -1):
     element = el[idx]
     if ....:
         del el[idx]

By running from end to start of the list, a "del" won't affect later iterations 
of the loop.
Generally: you shouldn't modify a list while doing a "for a in el:" - this just 
causes confusion (as you've already seen ;)



More information about the Python-list mailing list