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