In python, I noticed if I'm iterating through a list with for x in y
, and I remove an element of y
in the loop, the last element will be "skipped" - I'm assuming this is because len(y)
has changed.
I'm trying to grab all files with a particular extension, except those who meet some condition.
Here's the original code:
def test_print_numTXTs(fileList):
counter = 0
for file in fileList:
if file.name[-4:] == ".txt":
counter +=1
if file.name == "a.txt":
fileList.remove(file) #problem caused here
print(counter)
print(len(fileList))
The output for counter
is one less than the total number of .txt files. Stepping through the debugger, I can see it's skipping the last iteration of the loop (I'm assuming because len(fileList)
is now -=1
w.r.t. its initial len()
.
The following code "works", but feels like a hack - I'm adding the files I'd like to remove from the list to a second list, then iterating over that after the fact. I've commented out the line I originally had, which caused the "skipping" of iteration(s).
def print_numTXTs(fileList):
filesToRemoveFromList = []
counter = 0
for file in fileList:
if file.name[-4:] == ".txt":
counter +=1
if file.name == "a.txt":
#fileList.remove(file) #problem caused here
filesToRemoveFromList.append(file)
print(counter)
for file in filesToRemoveFromList:
fileList.remove(file)
print(len(fileList))
This code outputs a count of all the .txt files, and the length of the list is one less than that (because the element a.txt was removed) - this is the desired behaviour.
Is there a more elegant solution to this problem?