2015-12-26 27 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