我无法弄清楚为什么这段代码(用于从单词中删除元音)返回"列表索引超出范围错误。有什么建议 ?
def anti_vowel(string):
my_list = list(string)
for i in range(0,len(my_list)-1): #For loop iterates over the entire list
for c in "aeiouAEIOU": #For loop iterates over all vowels"
if my_list[i] == c:
my_list = my_list.pop(i)
return my_list
print anti_vowel("Hello")
答案 0 :(得分:2)
my_list = my_list.pop(i)
您正在从此语句的列表中删除项目,因此它循环遍历列表的原始长度,列表中的项目现在比启动项目少。
您可能希望在迭代之前复制列表,以便迭代原始列表但从新列表中删除项目。
答案 1 :(得分:2)
您正在迭代并改变列表,使其小于原始长度:
my_list = my_list.pop(i)
使用列表comp:
def anti_vowel(string):
my_list = list(string)
return [ x for x in my_list if x not in "aeiouAEIOU"]
如果您想要返回一个字符串,请在列表中使用join
:
"".join([ x for x in my_list if x not in "aeiouAEIOU"])
使用列表comp [ x for x in my_list if x not in "aeiouAEIOU"]
我们过滤字母,只保留不在元音字符串中的字母。
def anti_vowel(s):
return s.translate(None,"aeiouAEIOU")
答案 2 :(得分:1)
因为你要设置for循环从0到原始列表的长度,然后在循环中弹出列表中的项目 - 所以当你再次绕循环时,长度已经改变。 / p>