This is due to fact that you modify your list when iterating it. You can check what's going on with pythontutor.com visualizer or add some print statements like this:
templist = ['', 'hello', '', 'hi', 'mkay', '', '']
for i, element in enumerate(templist):
print("Step", i)
print('element is', repr(element), 'and templist is', templist)
if element == '':
print("element is empty")
templist.remove(element)
print("templist after remove", templist)
print (templist)Output:
Step 0
element is '' and templist is ['', 'hello', '', 'hi', 'mkay', '', '']
element is empty
templist after remove ['hello', '', 'hi', 'mkay', '', '']
Step 1
element is '' and templist is ['hello', '', 'hi', 'mkay', '', '']
element is empty
templist after remove ['hello', 'hi', 'mkay', '', '']
Step 2
element is 'mkay' and templist is ['hello', 'hi', 'mkay', '', '']
Step 3
element is '' and templist is ['hello', 'hi', 'mkay', '', '']
element is empty
templist after remove ['hello', 'hi', 'mkay', '']
['hello', 'hi', 'mkay', '']You see, that on Step 1 you pick '' as element. This is the third element of the initial list, but for retrieves it on the Step 2 as we modified the list on Step 0 (removed first '') and now this second '' has index 1. We remove it at the end of Step 1.
Then on Step 2 we get element with index 3 ('mkay') thus skipping 'hi'.
Finally on Step 3 you pick the last '' (not the previous to last) as this is element with index ''. We skipped the previous to last element due to the same reason as we skipped 'hello' on Step 1.
After Step 3 the list is exhausted and we get out of for loop. This is why the last '' kept.
As for the solution which works, you can try this one:
templist = [s for s in templist if s != '']As well as other solutions like .filter().
Very helpful explanation, thank you!