3 回答

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超9個(gè)贊
您正在修改正在迭代的列表,這必然會(huì)導(dǎo)致一些不直觀的行為。相反,創(chuàng)建列表的副本,這樣就不會(huì)從迭代的內(nèi)容中刪除元素。
for char in textlist[:]: #shallow copy of the list
# etc
為了澄清你所看到的行為,看看這個(gè)。放print char, textlist在您的(原始)循環(huán)的開(kāi)頭。您可能會(huì)期望,這將垂直地打印出字符串,并在列表旁邊打印出來(lái),但實(shí)際上您將得到以下內(nèi)容:
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!
那怎么回事?好人for x in yPython中的循環(huán)實(shí)際上只是語(yǔ)法糖:它仍然按索引訪問(wèn)List元素。因此,當(dāng)您在迭代列表時(shí)從列表中刪除元素時(shí),您將開(kāi)始跳過(guò)值(如上面所示)。因此,你永遠(yuǎn)看不到第二個(gè)o在……里面"look";跳過(guò)它,因?yàn)楫?dāng)刪除前一個(gè)元素時(shí),索引已經(jīng)“過(guò)去”了。然后,當(dāng)你到達(dá)o在……里面"Words",您將移除第一次出現(xiàn)的'o'就是你以前跳過(guò)的那個(gè)。
正如其他人所提到的,清單理解可能是一種更好(更干凈、更清晰)的方法。利用Python字符串是可迭代的事實(shí):
def remove_vowels(text): # function names should start with verbs! :)
return ''.join(ch for ch in text if ch.lower() not in 'aeiou')

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
for
vowels = 'aeiou'vowels += vowels.upper()text.translate(None, vowels)
>>> text = "Hey look Words!">>> vowels = 'aeiou'>>> vowels += vowels.upper()>>> text.translate(None, vowels)'Hy lk Wrds!' >>> text = 'The Quick Brown Fox Jumps Over The Lazy Fox'>>> text.translate(None, vowels)'Th Qck Brwn Fx Jmps vr Th Lzy Fx'
str.translate()
unicode.translate()
None
# Python 3 codevowels = 'aeiou'vowels += vowels.upper()vowels_table = dict.fromkeys(map(ord, vowels))text.translate(vowels_table)
str.maketrans()
vowels = 'aeiou'vowels += vowels.upper()text.translate(text.maketrans('', '', vowels))
添加回答
舉報(bào)