+6

# Why the last '-1' isn't removed?

arr = [-1,-1,2,3,4,-1,6,7,8,9,-1] for i in arr: if i==-1: arr.remove(i) print(arr) After i print(arr)..i get >>[2, 3, 4, 6, 7, 8, 9, -1] My question is that, why the last '-1' isn't removed?

4/1/2020 5:02:41 AM

Amit Dubey

+9

When you remove an item from a list, the counter in the next step jumps by one: At the first iteration i is -1 and you remove it. At the next iteration i is 2 (probably you think it should be -1, but as I said it jumps by one. Because the counter now should be on the second place of arr and now it's 2, and -1 is at the first place). It goes on until it reaches at the third -1. Then it removes the first occurrence of -1 which is at the first position but the current -1 remains unremoved and become the 4th element. Finally it reaches at the last -1 and when it wants to remove the first occurrence of -1, it's now on 4th position and the last -1 remains unremoved.

+10

Removing item while traversing the container is tricky. For that purpose you can remove -1 while there the container still contains -1. while arr.count(-1): arr.remove(-1)

+8

The reason why there are not all desired elements are removed, is because removing during an iteration on the list "changes" the indexes following a deletion position. But you can do the job like shown in the following samples # using reversed direction for iterating lst = [-1,4,3,-1,7,1,-1] for i in reversed(lst): if i == -1: lst.remove(i) print(lst) # using reversed direction for iterating lst = [-1,4,3,-1,7,1,-1] x = len(lst)-1 while x >= 0: if lst[x] == -1: del lst[x] x -= 1 print(lst) # using filter lst = [-1,4,3,-1,7,1,-1] print(list(filter(lambda x: x != -1, lst))) # using list comprehension lst = [-1,4,3,-1,7,1,-1] print([i for i in lst if i != -1])

+6

You can always see what the code does. Add print(arr) after "for i in arr:" and "arr.remove(i)". Another version of code may be: while -1 in arr: arr.remove(-1)

+4

The Golden Rule Never ever delete from a list that you are iterating.

+4

Loop over a copy of the iterable if there is any chance the iterable might change in size. arr = [-1, -1, 2, 3, 4, -1, 6, 7, 8, 9, -1] for i in arr[:]: # <-- this is a copy of "arr" if i == -1: arr.remove(i) print(arr)

+2

you might also use this arr[:] = (x for x in arr if x !=-1)

+2

At this point it seems that EVERYTHING I HAVE LEARNT SO FAR IS WRONG. plz let me know the answer

+2

Tarun that's because of jumping counter in each iteration. For example: Arr=[0,1,2,3,4] For i in Arr: Arr.remove(i) Print(Arr) >>> [1,3]

+2

Change the if condition to if -1 in arr: This way you can remove the -1 even if it is all over the list

+1

The reply with a 'green tick' is the reason behind it...Tarun

+1

I have altered the expression and found that i is not iterating to last of the list. arr=[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1] for i in arr: If i==-1: arr.remove(i) print(i) Excecute this code and u ll find lots of -1 Although you can simply remove this problem by i+=1 but still unable to find whats going on

+1

I Need debugging.

+1

amit avinoam Thanks for telling me that, but i just wanted to know why it doesn't work..

0

Qasem so, should i decrease the counter by 1 as to get it removed?

0

Amit Dubey you can't delete the last item by the structure you've mentioned. The easiest is what Ipang has said.

0

finally i got it why this is happening.... it took me three days to figure out but it was a lesson worth learning.

-1

Use del a[-1] to remove last element

-2

it should be position i so for your if statement it sould be if arr[i] == 1: arr.remove(i)