3 回答
TA贡献1799条经验 获得超9个赞
您正在修改正在迭代的列表,这必然会导致一些不直观的行为。相反,创建列表的副本,这样就不会从迭代的内容中删除元素。
for char in textlist[:]: #shallow copy of the list
# etc
为了澄清你所看到的行为,看看这个。放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!
那怎么回事?好人for x in yPython中的循环实际上只是语法糖:它仍然按索引访问List元素。因此,当您在迭代列表时从列表中删除元素时,您将开始跳过值(如上面所示)。因此,你永远看不到第二个o在……里面"look";跳过它,因为当删除前一个元素时,索引已经“过去”了。然后,当你到达o在……里面"Words",您将移除第一次出现的'o'就是你以前跳过的那个。
正如其他人所提到的,清单理解可能是一种更好(更干净、更清晰)的方法。利用Python字符串是可迭代的事实:
def remove_vowels(text): # function names should start with verbs! :)
return ''.join(ch for ch in text if ch.lower() not in 'aeiou')
TA贡献1852条经验 获得超1个赞
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))
添加回答
举报