2016-06-16 48 views
0

我正在使用codeacademy python初學者課程。我應該定義一個函數,該函數接受一個字符串,並在沒有元音的情況下返回它。我的函數刪除了一些元音,但通常不是全部,而是根據特定的字符串而變化,並且沒有清晰的圖案。我的代碼是下面,請過目,看看是否你能找到我的錯誤:學習Python;不知道爲什麼我的函數不能正常工作

def anti_vowel(text): 
    a = len(text) 
    b = 0 
    letters = [] 
    while a > 0: 
     letters.append(text[b]) 
     a -= 1 
     b += 1 
    for item in letters: 
     if item in "aeiouAEIOU": 
      letters.remove(item) 
    final = "" 
    return final.join(letters) 

回答

3

你的問題是,你遍歷列表letters,並在同一時間進行修改。這會導致迭代跳過輸入中的某些字母而不檢查它們。

例如,如果您的text字符串是'aex'letters列表將變爲['a', 'e', 'x']。當您迭代它時,item將在第一遍時爲'a',並且將調用letters.remove('a')。這會將letters更改爲['e', 'x']。但是列表迭代按索引工作,所以通過循環的下一個傳遞將不會有item設置爲'e',而是指向下一個索引'x'中的項目,因爲它不是元音,所以不會被刪除。

爲了使代碼正常工作,您需要更改其邏輯。要麼迭代列表副本,反向迭代,要麼創建一個包含所需項目的新列表,而不是刪除不需要的項目。

+0

很好的答案!注意最初的文本字符串應該閱讀'aex' – Mark

+0

哎呀,是的,我從''aab''切換到''aex'',以使元音之間的區別更加清晰。我編輯修復了'aab'的左邊。 – Blckknght

2

如果您在循環中修改循環的內容,您將始終得到意想不到的結果 - 這就解釋了爲什麼從函數中獲取奇怪的值。

在for循環中,您正在修改您應該循環的對象;改爲創建一個新對象。

這裏是去做一個辦法:

def anti_vowel(text): 
    results = [] # This is your new object 
    for character in text: # Loop over each character 
     # Convert the character to lower case, and if it is NOT 
     # a vowel, add it to return list. 
     if not character.lower() in "aeiou": 
      results.append(character) 
    return ''.join(results) # convert the list back to a string, and return it. 
1

我覺得@Blckknght一針見血的頭部。如果我提出這個問題,我想嘗試這樣的事:

def anti_vowel(text): 
    no_vowels = '' 
    vowels = 'aeiouAEIOU' 
    for a in text: 
     if a not in vowels: 
      no_vowels += a 

    return no_vowels 
0

如果您有由連續a字符的字符串(或任何元音)試試吧,你就會明白爲什麼。

實際的remove調用會修改該列表,以使該列表上的迭代器不再正確。

有很多方法可以解決這個問題,但最好的方法是不要使用該方法。它幾乎沒有什麼意義,使一個列表,你會然後將其刪除時,你可以創建一個全新的字符串中的字符,沿着線:

def anti_vowel (str): 
    set ret_str to "" 
    for ch as each character in str: 
     if ch is not a vowel: 
      append ch to ret_str 
    return ret_str 

順便說一句,不要誤認爲爲Python,它的意思是僞代碼來說明如何去做。它只是發生,如果你忽略了Python的所有黑暗角落,它會產生一個理想的僞代碼語言:-)

因爲這幾乎可以肯定是功課,它的你的工作把它變成你選擇的語言。

0

不知道你的函數應該如何工作,因爲它有很多錯誤。我會帶你通過我想出的解決方案。

def anti_vowel(text): 

    final = '' 

    for letter in text: 
     for vowel in 'aeiouAEIOU': 
      if (letter == vowel): 
       letter = "" 
     final += letter 

    print final   
    return final 
anti_vowel('AEIOUaeiou qwertyuiopasdfghjklzxcvbnm') 

我們初始化函數調用傳遞PARAM文本

def anti_vowel(text): 

我們將初始化最後一個空字符串

final = '' 

我們將着眼於所有文字把信交給在

for letter in text: 

每次我們這樣做,我們將考慮所有可能的元音

 def anti_vowel(text): 

如果這些匹配,我們正在檢查這封信,我們將把這信一個空字符串,以擺脫它。

  if (letter == vowel): 
       letter = "" 

一旦我們對每個元音進行了檢查,如果它是一個元音,那麼它將是一個空字符串。如果不是,它將是一個包含輔音的字符串。我們將這個值加到最後一個字符串上

 final += letter 

所有檢查和替換完成後打印結果。

print final 

返回結果

return final 

通過這項

anti_vowel('AEIOUaeiou qwertyuiopasdfghjklzxcvbnm') 

將返回該

qwrtypsdfghjklzxcvbnm

0

添加到什麼休息早已賽d,通過它循環的時候,你不應該修改迭代,這裏是我的整個代碼的短版:

def anti_vowel(text): 
    return text.translate(None, "aeiouAEIOU") 

的Python已經有一個「內置的文本卸妝」,你可以閱讀更多關於翻譯here

相關問題