Python 使用“修正索引错误”;通行证;但仍然得到;列表索引超出范围“;错误?
我是python的新手,我正在做一个有点复杂(但很有趣!)的项目。我不想谈太多细节,但我注意到之前类似的问题往往是针对非常具体的情况,这使我更难从中获得任何信息,但人们肯定更容易回答 我基本上使用的是36x36矩阵(在我的代码中简称为“数组”),其中左下角是条目0,上面的条目是1,依此类推,直到我们到达左上角的第36个条目,然后返回到条目0右侧的第37个条目,依此类推,我想知道参数右边、左边、上面和下面的条目的值。当然,有几个边缘案例不会有4个邻居,所以我努力将它们考虑在内,但我得到的错误似乎不一致 以下是我最近尝试过的一件事:Python 使用“修正索引错误”;通行证;但仍然得到;列表索引超出范围“;错误?,python,arrays,range,Python,Arrays,Range,我是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]不在数组中
等等)
如果我们尝试一步一步地评估,我们会得到以下结果:
。如果成功,我们有一些值
值
,在我们的例子中,该值将始终为真
,就像我们之前从数组
本身获得的值一样
如果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]
(对于所有未超出范围的)。