首頁 > 後端開發 > Python教學 > 為什麼在迭代期間修改列表時我的循環無法從字串中刪除所有元音?

為什麼在迭代期間修改列表時我的循環無法從字串中刪除所有元音?

DDD
發布: 2024-12-13 19:56:17
原創
234 人瀏覽過

Why does my loop fail to remove all vowels from a string when modifying the list during iteration?

循環「忘記」刪除某些項目

在下面的程式碼中,目標是建立一個名為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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板