繁体   English   中英

为什么我不断使索引超出范围

[英]Why do i keep getting index out of range

我正在通过checkio网站工作,遇到了我不理解的问题。 输入是一个由1和0加2的坐标组成的数组。 我需要编写一个函数以将一个圆中的圆数返回给我的坐标,而不是计算我所在的圆。 我一直使索引超出范围,但这是我的想法,但是我认为代码中的“尝试:除了索引错误:”会忽略它并移至下一个可迭代的位置。 它可以与网站提供的其他示例配合使用,这些示例在其他地方确实超出了我的范围,但是代码跳过了该示例并继续前进。 只是最后一个失败的测试,我无法弄清楚。 我进行了很好的搜索,看不到问题所在。 最初,我在“ for”循环中使用了“ try”,但并没有走那么远。 我觉得except应该在for循环内,但是我看到的每个示例都与“ try”处于同一级别。如果您帮助我,您将非常酷。 :)这是我陷入困境的示例代码。

def count_neighbours(grid, row, col):

    count = 0
    a = row - 1
    b = row + 1
    c = col - 1
    d = col + 1
    order = [grid[a][c], grid[a][col], grid[a][d],
             grid[row][c], grid[row][d],
             grid[b][c], grid[b][col], grid[b][d]]

    try:
        for z in order:
            count += z
    except IndexError:
        pass
    return count


count_neighbours(((1, 1, 1),(1, 1, 1),(1, 1, 1)), 0, 2)

因为当您在任何边缘上时,您都试图在不存在的位置越过边缘。

例如,检查数组中单元格[0,0]的邻居,您将尝试查看单元格[-1,-1](使用grid[a][c] ),该索引是“超出范围”范围”(不在0和数组大小之间)。 每当您位于最上面或最下面的行以及最左边或最右边的列时,就会发生这种情况。 您需要谨防这些特殊情况。

for z in order:
    if z >= 0 and z <= length:
       count += z

for循环不会引发IndexError异常,而是通过订单列表的初始化引发异常,您有时会尝试访问不在网格中的值(负索引或>大于网格大小或>大于网格大小)存储在网格中的元组)。

一种解决方案可能是存储索引而不是存储值,如下所示:

def count_neighbours(grid, row, col):

    count = 0
    a = row - 1
    b = row + 1
    c = col - 1
    d = col + 1

    orders = [(a, c), (a, col), (a, d),
    (row, c), (row, d),
    (b, c), (b, col), (b, d)]

    try:
        for x, y in orders:
            count += grid[x][y]
    except IndexError:
        pass

    return count


count_neighbours(((1, 1, 1),(1, 1, 1),(1, 1, 1)), 0, 2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM