简体   繁体   English

Python for循环未遍历所有项目

[英]Python for loop is not looping through all items

I am writing a function that removes all vowels from a word. 我正在编写一个功能,可以删除单词中的所有元音。 It looks like this: 看起来像这样:

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)

I expect it to go through all the letters in the word, check each letter if it is in the vowels array and, if so, remove it. 我希望它能遍历单词中的所有字母,检查每个字母是否在元音数组中,如果是,请将其删除。

However, it does not seem that it checks for all letters. 但是,它似乎并不检查所有字母。 For example, for the following call: 例如,对于以下调用:

print(remove_vowels('perception'))

I am getting the following output: 我得到以下输出:

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

For some reason, it skips the r , the second p and the o . 由于某些原因,它会跳过r ,第二个po I am getting a similar result with other words. 用其他词我得到类似的结果。 Why is this happening? 为什么会这样呢?

The reason why it didn't work before is during your for loop you are mutating word which means that it will skip over an iteration whenever you delete something because that deletion resulted in each letter moving up a position. 之前它不起作用的原因是在for循环中,您正在对word进行突变,这意味着每当您删除某些内容时,它都会跳过一次迭代,因为该删除导致每个字母都向上移动。 That means that if there was a deletion at position 2 then the next item is now at position 2 and the item after it is in position 3 which is where the next iteration is. 这意味着,如果位置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'))

As mentioned in comments, working on the element you are iterating on, is often troublesome. 如评论中所述,处理要迭代的元素通常很麻烦。 How about this: 这个怎么样:

Code: 码:

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

Test Code: 测试代码:

print(remove_vowels('perception'))

Results: 结果:

prcptn
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')) 
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'))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM