Rhamphoryncus schrieb:
> setapproach = """\
> def func(count):
>     from random import random
>     items = [random() for i in xrange(count)]
>     remove = set()
>     for index, x in enumerate(items):
>         #...do something...
>         if x < 0.5:
>             remove.add(index)
>     items = [x for index, x in enumerate(items) if index not in remove]
> """

This is different from the other approaches in that it doesn't
modify items. If you wanted a new list, you could incrementally
build one already in the first pass, no need to collect the
indices first (as BlackJack explains).

If you wanted in-place modification, I'd do

     newitems = []
     for x in items:
        if not (x < 0.5):
           newitems.append(x)
     items[:] = newitems

> copyapproach = """\
> def func(count):
>     from random import random
>     items = [random() for i in xrange(count)]
>     for x in items[:]:
>         if x < 0.5:
>             items.remove(x)
> """

This happens to work for your example, but is incorrect
in the general case: you meant to write

              del items[i+removed]

here, as .remove(x) will search the list again, looking
for the first value to remove. If your condition for
removal happens to leave some items equal to x in the
list, it would remove the wrong item. Because the numbering
changes while the iteration is in progress, you have
to count the number of removed items also.

Regards,
Martin
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to