Efficient way to remove objects from a list

M.-A. Lemburg mal at egenix.com
Mon Nov 3 12:22:38 CET 2008


On 2008-11-03 12:12, M.-A. Lemburg wrote:
>> 一首诗 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]

Sorry, the above should read:

for i, item in reversed(enumerate(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