Python for 循环不会遍历所有项目

Igo*_*din 2 python loops for-loop

我正在编写一个从单词中删除所有元音的函数。它看起来像这样:

def remove_vowels(word):

    vowels = ['a', 'e', 'i', 'o', 'u']

    word = list(word)

    for letter in word:
        print('Looking for letter {}'.format(letter))

        if letter.lower() in vowels:
            try: 
                word.remove(letter)
            except ValueError:
                pass

    return ''.join(word)
Run Code Online (Sandbox Code Playgroud)

我希望它遍历单词中的所有字母,检查每个字母是否在元音数组中,如果是,则将其删除。

但是,它似乎并未检查所有字母。例如,对于以下调用:

print(remove_vowels('perception'))
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

Looking for letter p
Looking for letter e
Looking for letter c
Looking for letter e
Looking for letter t
Looking for letter i
Looking for letter n
prcpton
Run Code Online (Sandbox Code Playgroud)

出于某种原因,它跳过了r、第二个po。我用其他词得到了类似的结果。为什么会这样?

Mik*_*ung 6

之前它不起作用的原因是在您的 for 循环期间您正在变异word,这意味着每当您删除某些内容时它都会跳过迭代,因为该删除导致每个字母向上移动一个位置。这意味着如果在位置 2 处有一个删除,那么下一个项目现在在位置 2 并且它之后的项目在位置 3,这是下一次迭代所在的位置。

def remove_vowels(word):

    vowels = ['a', 'e', 'i', 'o', 'u']

    word = list(word)
    print(word)
    new_word = []

    for letter in word:
        print('Looking for letter {}'.format(letter))

        if letter.lower() not in vowels:
            try: 
                new_word.append(letter)
            except ValueError:
                pass

    return ''.join(new_word)

print(remove_vowels('perception'))
Run Code Online (Sandbox Code Playgroud)