i am trying to remove an item 'e' from the list l
I thought it might be helpful to code some of the alternatives you've been given and look at the timings to put things into perspective. The code:
-------------------- remove.py --------------------
def remove_lc(x, lst):
lst[:] = [item for item in lst if item != x]def remove_list(x, lst):
result = []
for item in lst:
if item != x:
result.append(item)
lst[:] = resultdef remove_filter(x, lst):
lst[:] = filter(lambda item: item != x, lst)def remove_xrange(x, lst):
for i in xrange(len(lst)-1, -1, -1):
if lst[i] == x:
del lst[i]def remove_remove(x, lst):
while x in lst:
lst.remove(x)def remove_try(x, lst):
try:
while True:
lst.remove(x)
except ValueError:
passdef remove_ishwor(x, lst):
for item in lst[:]:
if item == x:
lst.remove(x);
--------------------------------------------------First, some timings when only 1 out of every 1000 elements needs to be removed. Timings were taken with Python 2.4 on a 2.26 Ghz Windows box using:
$ python -m timeit -s "import remove; lst = [x % 1000 for x in xrange(10000)]" "remove.remove_<name>(500, lst)"
remove_remove: 516 usec per loop remove_try: 604 usec per loop remove_ishwor: 1.61 msec per loop remove_xrange: 2.29 msec per loop remove_lc: 2.37 msec per loop remove_list: 5.3 msec per loop remove_filter: 5.65 msec per loop
Now, some timings when 1 out of every 10 elements needs to be removed. Timings were taken using:
$ python -m timeit -s "import remove; lst = [x % 10 for x in xrange(10000)]" "remove.remove_<name>(5, lst)"
remove_lc: 2.03 msec per loop remove_xrange: 2.08 msec per loop remove_list: 4.72 msec per loop remove_filter: 5.17 msec per loop remove_try: 30.7 msec per loop remove_ishwor: 31.5 msec per loop remove_remove: 60.2 msec per loop
The moral of the story here is that, if the items to be removed only make up a very small percentage of the list, an approach like remove_remove or remove_try might be okay. On the other hand, if you expect the items to be removed will make up even a moderate percentage of the list (e.g. 10%), then remove_lc or remove_xrange is a vastly better alternative.
Steve -- http://mail.python.org/mailman/listinfo/python-list
