Sam Heather
Sam Heather

Reputation: 1503

For loop is skipping some stuff! Python

I'm trying to run this code so that it runs a function for all elements of a list. For illustrative purposes here, basically it should print:

'----------Possible Word:', possible_word

for all items in my list. So, if I were to input ['p', 'r', 's'] it would run that print 3 times, one for each of those items. My code is below - when I run it it only runs for p and s, not r, which is really odd. Any ideas?

def check_matches(input):
print 'Input:', input
for possible_word in input:
    print '----------Possible Word:', possible_word
    valid = True
    for real_word in word_dictionary:
        possible_word_list = list(possible_word)
        real_word_list = list(real_word)
        print possible_word_list
        print real_word_list
        number_of_characters_to_check = len(possible_word_list)
        for x in range(0, number_of_characters_to_check):
            print possible_word_list[x] + real_word_list[x]
            if (possible_word_list[x] != real_word_list[x]):
                valid = False
    if (valid == False):
        input.remove(possible_word)
print all_possible
return input

Upvotes: 0

Views: 1043

Answers (2)

SuperFamousGuy
SuperFamousGuy

Reputation: 1575

Jon Clements is right. You generally don't want to do something like this. However I'll assume you have a specific need for it.

The answer is simple. Change the line

for possible_word in input:

to this line

for possible_word in input[:]:

This will make a copy of the list for you to iterate over. That way when you remove an item it won't effect your loop.

Upvotes: 3

Jon Clements
Jon Clements

Reputation: 142216

When you run input.remove(possible_word) you're changing the size of the list which you happen to be iterating over, which leads to peculiar results. In general, don't mutate anything that you're iterating over.

More concise example:

>>> lst = ['a', 'b', 'c']
>>> for el in lst:
    print el
    lst.remove(el)

a
c

Upvotes: 6

Related Questions