list IndexError

Mike C. Fletcher mcfletch at
Wed Dec 22 20:59:32 CET 2004

Ishwor wrote:

>i am trying to remove an item 'e' from the list l but i keep getting IndexError.
>I know the size of the list l is changing in the for loop & its sort
>of trivial task but i found no other way than to suppress the
>IndexError by doing a pass. any other ways you guys can suggest? Also
>is this a good or bad habit in Python? someone may perhaps suggest a
>better way which i am unaware of?? the deletion could be invoked from
>user input (command line) as well so its not limited to 'e'( as in my
Probably the most pythonic approach to this problem when dealing with 
small lists is this:

    result = [ item for item in source if item != 'e' ]

or, if you're using an older version of Python without list comprehensions:

    filter( lambda item: item!='e', source )

or even (expanding the list comprehension):

    result = []
    for item in source:
       if item != 'e':
          result.append( item )

The "python"-ness of the solutions is that we are using filtering to 
create a new list, which is often a cleaner approach than modifying a 
list in-place.  If you want to modify the original list you can simply 
do source[:] = result[:] with any of those patterns.

If you really do need/want in-place modification, these patterns are 
quite serviceable in many instances:

    # keep in mind, scans list multiple times, can be slow
    while 'e' in source:

or (and this is evil C-like code):

    for index in xrange( len(source)-1, -1, -1 ):
       if source[i] == 'e':
          del source[i]

Keep in mind that, in the presence of threading, any index-based scheme 
is likely to blow up in your face (even the filtering solutions can 
produce unexpected results, but they are generally not going to raise 
IndexErrors due to off-the-end-of-the-list operations).

Good luck,

  Mike C. Fletcher
  Designer, VR Plumber, Coder

More information about the Python-list mailing list