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