【问题标题】:I can't figure out why this code is returning a "list index out of range" error [duplicate]我无法弄清楚为什么此代码返回“列表索引超出范围”错误 [重复]
【发布时间】:2014-10-12 19:07:21
【问题描述】:

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

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

【问题讨论】:

  • range(0,5) 返回[0,1,2,3,4]。你不需要 -1。

标签: python list


【解决方案1】:
my_list = my_list.pop(i)

您正在从该语句中的列表中删除项目,因此当它在列表的原始长度上循环时,现在列表中的项目比开始时要少。

您可能希望在迭代之前复制列表,以便迭代原始列表但从新列表中删除项目。

【讨论】:

    【解决方案2】:

    您正在迭代并改变您的列表,使其小于原始长度:

    my_list = my_list.pop(i)
    

    使用列表组合:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-13
        • 2020-10-11
        • 1970-01-01
        相关资源
        最近更新 更多