pythonlistiteration

Adding element to list while iterating


I know that it is not allowed to remove elements while iterating a list, but is it allowed to add elements to a python list while iterating. Here is an example:

for a in myarr:
    if somecond(a):
        myarr.append(newObj())

I have tried this in my code and it seems to work fine, however I don't know if it's because I am just lucky and that it will break at some point in the future?

I prefer not to copy the list since myarr is huge, and therefore it would be too slow. Also I need to check the appended objects with somecond().

At some point somecond(a) will be false, so there can not be an infinite loop.

Each object in myarr has a size, and each time somecond(a) is true and a new object is appended to the list, the new object will have a size smaller than a. somecond() has an epsilon for how small objects can be and if they are too small it will return "false".


Solution

  • You could use the islice from itertools to create an iterator over a smaller portion of the list. Then you can append entries to the list without impacting the items you're iterating over:

    islice(myarr, 0, len(myarr)-1)
    

    Even better, you don't even have to iterate over all the elements. You can increment a step size.