在下面的程式碼中,目標是建立一個名為anti_vowel 的函數,用於消除給定字串中的元音。雖然函數看起來很簡單,但在處理字串「Hey Look Words!」時,它會出現問題,產生「Hy lk Words!」。該函數無意中未能刪除“look”中的最後一個“o”。
text = "Hey look Words!" def anti_vowel(text): textlist = list(text) for char in textlist: if char.lower() in 'aeiou': textlist.remove(char) return "".join(textlist) print anti_vowel(text)
問題源自於在迭代列表時修改列表。這種方法會導致意想不到的後果。為了修正這個問題,應該建立輸入清單的副本,以便有效地刪除元音而不影響後續元素的位置。
for char in textlist[:]: #shallow copy of the list # etc
為了更好地理解,請考慮以下程式碼,程式碼說明了問題:
textlist = ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] for char in textlist: print(char, textlist)
預期輸出將是字串的垂直列表,但實際輸出是:
H ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] e ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] ['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] # ! l ['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] o ['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] k ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] # Problem!! ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] W ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] o ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] d ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] s ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] ! ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] Hy lk Words!
隨著循環的進行,元素將從清單中刪除,跳過下一個元素。在“look”的情況下,會跳過第二個“o”,因為索引已超出它。因此,“Words”中的最後一個“o”被刪除,而不是“look”中的那個。
利用 Python 的列表推導式提供了更清晰、更簡潔的解決方案:
def remove_vowels(text): # function names should start with verbs! :) return ''.join(ch for ch in text if ch.lower() not in 'aeiou')
以上是為什麼在迭代期間修改列表時我的循環無法從字串中刪除所有元音?的詳細內容。更多資訊請關注PHP中文網其他相關文章!