我无法弄清楚为什么这段代码返回“列表索引超出范围”错误

时间:2014-08-19 15:38:33

标签: python list

我无法弄清楚为什么这段代码(用于从单词中删除元音)返回"列表索引超出范围错误。有什么建议 ?

    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")

3 个答案:

答案 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"]我们过滤字母,只保留不在元音字符串中的字母。

str.translate

 def anti_vowel(s):
        return s.translate(None,"aeiouAEIOU")

答案 2 :(得分:1)

因为你要设置for循环从0到原始列表的长度,然后在循环中弹出列表中的项目 - 所以当你再次绕循环时,长度已经改变。 / p>