【问题标题】:Solving error: "list index out of range" in Python解决错误:Python 中的“列表索引超出范围”
【发布时间】:2020-09-01 17:29:28
【问题描述】:

代码给出了所有测试用例的正确答案,除非我输入一个列表,例如 [1,2,3,4,5]。然后显示:

IndexError:列表索引超出范围。

为什么会这样?最后的else 语句不应该解决这个问题吗?

def func(n):
    my_list = n.split()
    l = []

    for i in my_list:
         l.append(int(i))

    if len(l)==0 or len(l)==1:
        return None

    for k in range(0, len(l)):
        if l[k+1] >= l[k] + 2:
            return l[k+1]
        else:
            return None

n = input()

print(func(n)) 

【问题讨论】:

  • else 的缩进和问题一样吗?
  • l[k+1] 中的 k+1if 条件下无论如何都超出了范围
  • 使用trycatchexcept进行错误处理。
  • 使用for k in range(0,len(l)),k 将从 0 变为 len(l)-1。当 k 等于 len(l)-1 时,这会导致 l[k+1] 超出if l[k+1]>=l[k]+2: 的范围。
  • 您能指定您输入的确切输入吗?因为我无法重现您的错误,我也不希望能够重现。你永远不会迭代列表的末尾,因为你总是在if/else 中的任何一个分支之后return。这可能不是您真正想要的,但您不应该得到IndexError。请确保这是minimal reproducible example。如果它不能用你的代码重现,它对我们没有多大好处!

标签: python index-error


【解决方案1】:

错误出现在这里:

for k in range(0,len(l)):
    if l[k+1]>=l[k]+2:
        return l[k+1]
    else:
        return None

因为你迭代到 k = len(l) - 1 包含在内,所以最后一次迭代的 k + 1 将是 len(l),这是超出范围的。相反,您应该将 for 更改为:

for k in range(0, len(l) - 1):
    ...

现在,最后一次迭代中k + 1 的值将是len(l) - 2 + 1 = len(l) - 1,在l 的范围内。

【讨论】:

  • 虽然您描述的是代码中的一个错误,但它实际上不会发生在问题中编写的代码版本中,因为它总是returns on第一次迭代。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 2022-01-20
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
相关资源
最近更新 更多