为什么我会让索引超出范围

时间:2016-02-14 20:16:04

标签: python

我正在通过checkio网站工作,遇到了一个我不明白的问题。输入是1和0以及2个坐标的数组。我需要编写一个函数来返回我的坐标中有多少个循环,不计算我所在的那个。我一直把索引超出范围,但是我认为'尝试:除了索引错误:'我的代码中的一点会忽略它并移动到下一个可迭代的代码。它适用于网站提供的其他示例,其他地方确实超出范围,但代码会跳过它并继续前进。只是最后一次测试失败了,我无法弄明白。我有一个很好的搜索,无法看到问题。起初我做了'尝试''在'内为'循环,但它没有那么远。我觉得除了应该在for循环中,但每个例子我都看到它与'尝试'如果你帮助我,你就是很酷的。 :)这是代码中的代码,我被卡住了。

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)

2 个答案:

答案 0 :(得分:0)

因为当你处于任何边缘时,你都试图在不存在的地方看过边缘。

例如,检查要尝试的数组中单元格[0,0]的邻居,查看单元格[-1,-1](使用grid[a][c]),这是一个索引< / em>这是&#34;超出范围&#34; (不在0和数组大小之间)。每当您位于顶部或底部行以及左侧或最右侧列时,都会发生这种情况。你需要防范这些特殊情况。

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

答案 1 :(得分:0)

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

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

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)