In short, I need to remove multiple items from a list according to their indexes. However, I can’t use pop because it shifts the indexes (without some clumsy compensating system). Is there a way to remove multiple items simultaneously?
I have an algorithm that goes through a list, and if the conditions are right removes that item via the pop method. A problem arises seeing as this is all done in a loop. Once pop is done the list is shortened by one, displacing all the values by one. So the loop will go out of range. Is it possible to remove multiple items simultaneously, or another solution?
An example of my problem:
L = ['a', 'b', 'c', 'd']
for i in range(len(L)):
print L
if L[i] == 'a' or L[i] == 'c':
L.pop(i)
Are your lists large? If so, use
ifilterfromitertoolsto filter out elements that you don’t want lazily (with no up front cost).Lists not so large? Just use a list comprehension:
This will create a new copy of the list. This is not generally an issue for efficiency unless you really care about memory consumption.
As a happy medium of syntax convenience and laziness ( = efficiency for large lists), you can construct a generator rather than a list by using
()instead of[]:After this, you can iterate over
interestingelts, but you can’t index into it: