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