Iterator, modify data in loop body

Chris Angelico rosuav at gmail.com
Sat Sep 13 17:32:48 CEST 2014


On Sun, Sep 14, 2014 at 1:27 AM, Ian Kelly <ian.g.kelly at gmail.com> wrote:
> On Sat, Sep 13, 2014 at 1:39 AM, Michael Welle <mwe012008 at gmx.net> wrote:
>>> In that case, don't iterate over the list at all. Do something like this:
>>>
>>> while lst:
>>>     element = lst.pop(0)
>>>     # work with element
>>>     lst.append(new_element)
>>>
>>> There's no mutation-while-iterating here, and it's clear that you'll
>>> keep going until there's absolutely nothing left.
>> Ah, that looks like a good approach, thank you.
>
> Also note that this approach (appending to the end and popping from
> the front) will be more efficient using a collections.deque than a
> list.

Sure it will - that's kinda the point of a double-ended queue, to
avoid all the inefficient movements :) But the concept is still the
same: do repeated mutations rather than iteration. Either that, or
iterate and build up a new list, either with a comprehension or with
something like this:

newlst = []
for element in lst:
    # work with element
    newlst.append(new_element)

ChrisA



More information about the Python-list mailing list