Python 使用“修正索引错误”;通行证;但仍然得到;列表索引超出范围“;错误?

Python 使用“修正索引错误”;通行证;但仍然得到;列表索引超出范围“;错误?,python,arrays,range,Python,Arrays,Range,我是python的新手,我正在做一个有点复杂(但很有趣!)的项目。我不想谈太多细节,但我注意到之前类似的问题往往是针对非常具体的情况,这使我更难从中获得任何信息,但人们肯定更容易回答 我基本上使用的是36x36矩阵(在我的代码中简称为“数组”),其中左下角是条目0,上面的条目是1,依此类推,直到我们到达左上角的第36个条目,然后返回到条目0右侧的第37个条目,依此类推,我想知道参数右边、左边、上面和下面的条目的值。当然,有几个边缘案例不会有4个邻居,所以我努力将它们考虑在内,但我得到的错误似乎不

我是python的新手,我正在做一个有点复杂(但很有趣!)的项目。我不想谈太多细节,但我注意到之前类似的问题往往是针对非常具体的情况,这使我更难从中获得任何信息,但人们肯定更容易回答

我基本上使用的是36x36矩阵(在我的代码中简称为“数组”),其中左下角是条目0,上面的条目是1,依此类推,直到我们到达左上角的第36个条目,然后返回到条目0右侧的第37个条目,依此类推,我想知道参数右边、左边、上面和下面的条目的值。当然,有几个边缘案例不会有4个邻居,所以我努力将它们考虑在内,但我得到的错误似乎不一致

以下是我最近尝试过的一件事:

def neighbors(i):
    neighbors_array = []
    if array[i+1] in array:
        neighbors_array.append(array[i+1])
    if array[i-1] in array:
        neighbors_array.append(array[i-1])
    if array[i+36] in array:
        neighbors_array.append(array[i+36])
    if array[i-36] not in array:
        neighbors_array.append(array[i-36])
    return neighbors_array

对于数组中间的一个参数,比如800,我得到4个值,完全匹配如果我单独打印<代码>数组[i+1] ,<代码>数组[I-1 ] < /代码>,等等。但是对于我知道的矩阵最左边的一列中的参数,我得到了一个包含4个条目的输出数组,尽管我只期望3个条目,因为该参数没有关联的[I-36]元素。对于我知道的最右边列中的参数,我得到

indexer:list index超出范围

我不明白为什么两个边缘案例没有相同的问题,我想解决这两个问题。对于顶行和底行中的条目,我还得到了一个意外的4条目输出,除了右上角和右下角,我得到了索引错误


我曾尝试将数组转换为实际矩阵,但邻域函数输出更为复杂,而且我也遇到了类似的问题,因此我认为我更愿意使用数组。

这不能作为边界检查:

if array[i-1] not in array:
    pass
if i not in range(len(array)):
因为只要你说
array[i-1]
你就会在你的
if
谓词完成计算之前引发一个异常。在将
i
用作数组索引之前,需要检查它是否为有效索引

这是执行这种边界检查的惯用方法:

if array[i-1] not in array:
    pass
if i not in range(len(array)):
对于您想要“包装”超出边界的值的特定用例,我建议使用模(
%
)操作符,而不是使用边界检查在一个方向或另一个方向上单独包装。让数学为你做这项工作。:)


由于
36%36==0
-1%36==35
,等等您看到的实际问题是在数组中的代码
数组[某物]
(最初
数组[i+36]不在数组中
等等)

如果我们尝试一步一步地评估,我们会得到以下结果:

  • 首先计算数组[something]。这可能会导致索引器出现
    。如果成功,我们有一些
  • 现在计算数组中的
    ,在我们的例子中,该值将始终为
    ,就像我们之前从
    数组
    本身获得的
    值一样
  • 解决方案:

    对于列表,您应该检查列表的长度,以防止索引器出现以下情况:

    如果len(数组)>i+36:
    使用(数组[i+36])执行任何操作
    
    pythonicaproach:

    在python中,“请求原谅而不是许可”被认为是一种很好的风格,因此,您可以使用try-access-except-cleanup模式,而不是if-In-range-do模式:

    试试看:
    使用(数组[i+36])执行任何操作
    除索引器外:
    通过,因为您在原始代码中也跳过了这个案例
    
    使用元素列表可能更容易。对于2x2,这将是
    矩阵=[[1,2],[3,4]]
    矩阵[i][j]
    的邻居将是
    矩阵[i][j-1]
    矩阵[i][j+1]
    矩阵[i-1][j]
    (对于所有未超出范围的)。