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 -- http://mail.python.org/mailman/listinfo/python-list