Removing items from a list

T

Thomas Philips

In the past, when deleting items from a list, I looped through the
list in reverse to avoid accidentally deleting items I wanted to keep.
I tried something different today, and, to my surprise, was able to
delete items correctly, regardless of the direction in which I looped,
in both Python 3.2.2. and 2..1 - does the remove() function somehow
allow the iteration to continue correctly even when items are removed
from the midde of the list?
x = list(range(10))
x [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for i in x:
if i % 2 == 0:
x.remove(i)
x [1, 3, 5, 7, 9]
for i in reversed(x):
if i % 2 == 0:
x.remove(i)
x [1, 3, 5, 7, 9]
x = list(range(10))
for i in reversed(x):
if i % 2 == 0:
x.remove(i)

[1, 3, 5, 7, 9]

Sincerely

Thomas Philips
 
I

Ian Kelly

In the past, when deleting items from a list, I looped through the
list in reverse to avoid accidentally deleting items I wanted to keep.
I tried something different today, and, to my surprise, was able to
delete items correctly, regardless of the direction in which I looped,
in both Python 3.2.2. and 2..1 -  does the remove() function somehow
allow the iteration to continue correctly even when items are removed
from the midde of the list?

No. Your test works because you never attempt to remove two adjacent
items, so the skipping of items doesn't end up mattering. Try the
same thing, but print out the values as you iterate over them:

x = list(range(10))
x [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for i in x:
.... print(i)
.... if i % 2 == 0:
.... x.remove(i)
....
0
2
4
6
8[1, 3, 5, 7, 9]


Had you attempted to remove any of the odd numbers as well, it would
have failed.

Cheers,
Ian
 
M

MRAB

In the past, when deleting items from a list, I looped through the
list in reverse to avoid accidentally deleting items I wanted to keep.
I tried something different today, and, to my surprise, was able to
delete items correctly, regardless of the direction in which I looped,
in both Python 3.2.2. and 2..1 - does the remove() function somehow
allow the iteration to continue correctly even when items are removed
from the midde of the list?
x = list(range(10))
x [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for i in x:
if i % 2 == 0:
x.remove(i)
x [1, 3, 5, 7, 9]
for i in reversed(x):
if i % 2 == 0:
x.remove(i)
x [1, 3, 5, 7, 9]
x = list(range(10))
for i in reversed(x):
if i % 2 == 0:
x.remove(i)

[1, 3, 5, 7, 9]
The answer is no. For example:
print("i is", i)
if i % 2 == 0:
x.remove(i)


i is 0
i is 1
i is 2
i is 4[0, 1, 3, 5]
 
T

Thomas Philips

Thanks for the insight. I saw the behavious as soon as I extended x
with a bunch of 0's
x = list(range(10))
x.extend([0]*10)
x [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
for i in reversed(x):
if i % 2 == 0:
x.remove(i)
[1, 3, 5, 7, 9]
x = list(range(10))
x.extend([0]*10)
x [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
for i in x:
if i % 2 == 0:
x.remove(i)

[1, 3, 5, 7, 9, 0, 0, 0, 0, 0]
 
C

Chris Angelico

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]       if i % 2 == 0:
               x.remove(i)

Just a quickie, is there a reason you can't use a list comprehension?

x = [i for i in x if i % 2]

ChrisA
 
T

Thomas Philips

I could indeed have addressed this problem with a list comprehension.
It escaped me at the time because the larger problem I was trying to
solve included removing data from a dictionary:

months =
sorted(list(dataDict.keys())) #Sort
months in ascending order

for mth in
reversed(months): #Remove
months with inadequate data
if len(dataDict[mth]) < minItems:
months.remove(mth)
del dataDict[mth]

There's more than one way to solve this problem, and, with the benefit
of hindsight, my solution was sloppy, but thanks to the help I
received, I was able to get my code working correctly. Cleaning up is
the next phase!

Thanks, all.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,756
Messages
2,569,533
Members
45,007
Latest member
OrderFitnessKetoCapsules

Latest Threads

Top