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

时间:2017-05-05 04:20:48

标签: 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)

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

然而,它似乎并不检查所有字母。例如,对于以下呼叫:

print(remove_vowels('perception'))

我得到以下输出:

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

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

4 个答案:

答案 0 :(得分:3)

之前没有工作的原因是在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'))

答案 1 :(得分:1)

如评论中所述,处理您正在迭代的元素通常很麻烦。怎么样:

<强>代码:

def remove_vowels(word):
    vowels = set('aeiou')
    return ''.join(l for l in word if l not in vowels)

测试代码:

print(remove_vowels('perception'))

<强>结果:

prcptn

答案 2 :(得分:0)

def remove_vowels(word):

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

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

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

    return ''.join(result)


print(remove_vowels('perception')) 

答案 3 :(得分:0)

def remove_vowels(word):

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

word = list(word)
word_new = []
for letter in word:
    print('Looking for letter {}'.format(letter))
    if letter.lower() in vowels:
        continue
    else:
        word_new.append(letter)

return ''.join(word_new)
print(remove_vowels('perception'))