Efficient way to remove objects from a list
M.-A. Lemburg
mal at egenix.com
Mon Nov 3 06:12:43 EST 2008
> 一首诗 wrote:
>> Hi all,
>>
>> Today I wrote some code like this:
>>
>> for m in self.messages:
>> if not m.finished:
>> continue
>>
>> #process the message
>>
>> fini = [m for m in self.messages if m.finished]
>> for m in fini:
>> self.messages.remove(m)
>>
>> As you can, I want to find these finished messages in
>> "self.messages",
>> process them, and then remove them from the list.
>>
>> Because a list can not be modified while iterating it, I have to use
>> a list "fini" to accomplish the target.
>>
>> I found a smell of bad performance here.
>> Is there any faster ways?
The typical way to do this is to iterate over the list in reverse
order and then using the item index as basis for removing the
item:
for i, item in enumerate(reversed(mylist)):
# process item
del mylist[i]
--
Marc-Andre Lemburg
eGenix.com
Professional Python Services directly from the Source (#1, Nov 03 2008)
>>> Python/Zope Consulting and Support ... http://www.egenix.com/
>>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/
>>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/
________________________________________________________________________
:::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,MacOSX for free ! ::::
eGenix.com Software, Skills and Services GmbH Pastor-Loeh-Str.48
D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
Registered at Amtsgericht Duesseldorf: HRB 46611
More information about the Python-list
mailing list