2015-12-26 26 views
2

下面的代码:流行()函数不是正确运行for循环

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

def anti_vowel(text): 
    tlength = len(text) 
    words = [] 
    result = "" 
    for word in range(len(text)): 
     words.append(text[word]) 
     print words 
    for index, word in enumerate(words): 
     if word.lower() in vowels: 
      words.pop(index) 
    for old_word in words: 
     result += str(old_word) 
    return result 

print anti_vowel("Hey look words!") 

预期的结果: “海兰LK WRDS” 显然的结果:“Hy lok的话!”

我无法弄清楚为什么循环跳过列表中的索引5上的'o'。我知道我可以通过将非元音字添加到列表中并将它们组合起来,以另一种方式做到这一点,但我想知道如何获得上述代码所需的结果。

+0

我的输出 - >'海兰乐WRDS' –

+0

你修改'words'而伊特拉翻过来。 –

+0

在使用'str'转换之前,'old_word'是什么类型? –

回答

4

您正在删除字符,但您的index正在指向。因此,你期望的元音不再处于索引处。

最好不要在更改列表循环,而是创建一个新:

def anti_vowel(text): 
    words = [] 
    for character in text: 
     if not (character.lower() in vowels or character.upper() in vowels): 
      words.append(character) 
    return ''.join(words) 

或发电机的表达:

def anti_vowel(text): 
    return ''.join(c for c in text if c.lower() not in vowels) 

当要删除单个元素,必须使用while循环:

def anti_vowel(text): 
    text = list(text) 
    index = 0 
    while index < len(text): 
     if text[index].lower() in vowels: 
      del text[index] 
     else: 
      index += 1 
    return ''.join(text) 
+0

完美而简单:) –

+2

生成器比'str.join'中的列表理解效率低。请参阅[何时不适合使用python生成器?](http://stackoverflow.com/questions/245792/when-is-not-a-good-time-to-use-python-generators) –

+0

谢谢为你的答案丹尼尔,是的,我已经提到我知道这种方式。所以基本上你的意思是,当我删除/弹出列表中的东西时,索引会继续,并且弹出过程就像是一个缓慢的过程,无法在前一个旁边的'o'处同步索引?并且没有办法纠正这个问题? (我不善于解释东西..请原谅我) – Areeb