properly delete item during "for item in..."
Duncan Booth
duncan.booth at invalid.invalid
Thu Jul 17 13:27:22 EDT 2008
mk <mrkafk at gmail.com> wrote:
> Iterating over a copy may _probably_ work:
>
> >>> t=['a', 'c', 'b', 'd']
> >>>
> >>> for el in t[:]:
> del t[t.index(el)]
>
>
> >>> t
> []
>
>
> However, is it really safe? Defining safe as "works reliably in every
> corner case for every indexable data type"?
No, because you cannot necessarily copy every indexable data type using
t[:], and not all types will support index. Also it is inefficient to
delete from the start of the list.
If you are working with a list and deleting every object:
del t[:]
will suffice.
If you don't want to delete everything then you could do:
for index, el in enumerate(reversed(t)):
if not wewant(el):
del t[index]
but the pythonic way is just:
t[:] = [ el for el in t if wewant(el) ]
or if you just want the filtered list and don't care about updating the
original:
t = [ el for el in t if wewant(el) ]
> Con: suppose the data structure t is really, really big. Just deleting
> some items from t temporarily doubles the memory consumption.
No it doesn't. Copying a list doesn't copy any of the elements in the list,
it just copies the references to those element.
More information about the Python-list
mailing list