2017-05-05 188 views
0

我正在编写一个从单词中删除所有元音的函数。它看起来像这样:Python for循环没有循环遍历所有项目

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。我用其他词语得到了类似的结果。这是为什么发生?

+2

因为'word.remove(字母)'删除元音和你迭代相同'word'名单。现在他们有不同的'索引'。尝试将元素添加到新列表。 – sinsuren

+0

[迭代时从列表中删除项目]可能的重复(http://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-iterating) – McGrady

回答

2

之所以说它在您的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')) 
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')) 
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 
+0

哇,这很简洁。但我只是学习Python,所以我会坚持更容易阅读解决方案。 –

+0

@IgorSkoldin,感谢您的反馈,是的,您一定要随心所欲。不过,我衷心的推荐,以及我在初学者帖子上发布这些解决方案的原因是,您花时间学习这种语法。它不像最初看起来那样艰难,而且它是非常强大的。欢呼声,祝你好运。 –

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