我正在通过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)
答案 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)