Ishwor wrote:
i am trying to remove an item 'e' from the list l but i keep getting IndexError.Probably the most pythonic approach to this problem when dealing with small lists is this:
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
code)
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: source.remove('e')
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
________________________________________________ Mike C. Fletcher Designer, VR Plumber, Coder http://www.vrplumber.com http://blog.vrplumber.com
-- http://mail.python.org/mailman/listinfo/python-list