Python3 - 索引超出现有元素的范围

时间:2017-08-26 20:05:59

标签: python arrays outofrangeexception

我正试图从Project Euler解决问题18。我的代码是:

lines = []
lines.append([3])
lines.append([7, 4])
lines.append([2, 4, 6])
lines.append([8, 5, 9, 3])

i = len(lines) - 1
while i != -1:
    for j in range(0, len(lines[i - 1])):
        a = lines[i][j]
        b = lines[i][j + 1]
        if a > b:
            lines[i - 1][j] = a
        else:
            lines[i - 1][j] = b
    i -= 1

控制台中的结果是:

    E:\path_to_python\Python3\python.exe E:/path_to_python/Projects/ProjectEuler/18.py
    Traceback (most recent call last):
      File "E:/path_to_script/18.py", line 33, in <module>
        b = lines[i][j + 1]
    IndexError: list index out of range

    Process finished with exit code 1

令人困惑的部分是那个

    print("lines[{}][{}] = {} > {} = lines[{}][{}]".format(i,j,lines[i][j], lines[i][j+1], i,j+1))

创建输出:

Traceback (most recent call last):
      File "E:/path_to_scripter/18.py", line 31, in <module>
        print("lines[{}][{}] = {} > {} = lines[{}][{}]".format(i,j,lines[i][j], lines[i][j+1], i,j+1))
    IndexError: list index out of range
    lines[3][0] = 8 > 5 = lines[3][1]
    lines[3][1] = 5 > 9 = lines[3][2]
    lines[3][2] = 9 > 3 = lines[3][3]
    lines[2][0] = 8 > 9 = lines[2][1]
    lines[2][1] = 9 > 9 = lines[2][2]
    lines[1][0] = 9 > 9 = lines[1][1]

所以每个元素都存在但同时超出范围?这里我的错误是什么?

2 个答案:

答案 0 :(得分:0)

以下是错误点代码的视觉效果:

enter image description here

因此,您可以在第11行看到,您正在尝试访问第0个子数组的索引1处的元素,但此数组在索引0处只有一个元素,因此超出范围错误。 / p>

希望这有助于您调试和解决这一挑战:D

答案 1 :(得分:-1)

for循环中,您每次都获得:lines[i][j]lines[i][j + 1]lines[i-1][j],这意味着j < n-1n列表lines[i]的长度。所以你应该写:

for j in range(0, len(lines[i])-1):

而不是:

for j in range(0, len(lines[i - 1])):

请注意,此外,您可以使代码更优雅:

for i in range(len(lines)-1,0,-1):
    for j in range(0, len(lines[i])-1):
        a = lines[i][j]
        b = lines[i][j + 1]
        if a > b:
            lines[i-1][j] = a
        else:
            lines[i-1][j] = b

因此,我们可以为range(..)使用其他i。如果我们准确翻译它,它应该是range(len(lines)-1,-1,-1)。但是在i = 0的情况下,第二个for循环将为空,因此我们可以停在i = 1,因此range(len(lines)-1,0,-1)