Python3初始化2D数组会忽略索引规范范围(开始、结束、步骤)



我想初始化python3中的一个数组,该数组的索引不是从零和2维开始的。

x_length=16
y_length=4
x_start=-4
y_start=-400
# Later passing those variables with:
level_matrix=generate_area(x_length,y_length,x_start,y_start)

部分功能:

def generate_area(xlen,ylen,xstart,ystart):
matrix=[[0 for y in range(ystart, ystart+ylen)] for x in range(xstart, xstart+xlen)]
for index, value in enumerate(matrix):
print(f"S1_vec('{index}')<= {value}")
for index, value in enumerate(matrix[0]):
print(f"S1_vec('{index}')<= {value}")
for x in range(xstart, xstart+xlen):
for y in range(ystart, ystart+ylen):
print("Y:"+str(y))
print("X:"+str(x))

输出:

S1_vec('0')<= [0, 0, 0, 0]
S1_vec('1')<= [0, 0, 0, 0]
S1_vec('2')<= [0, 0, 0, 0]
S1_vec('3')<= [0, 0, 0, 0]
S1_vec('4')<= [0, 0, 0, 0]
S1_vec('5')<= [0, 0, 0, 0]
S1_vec('6')<= [0, 0, 0, 0]
S1_vec('7')<= [0, 0, 0, 0]
S1_vec('8')<= [0, 0, 0, 0]
S1_vec('9')<= [0, 0, 0, 0]
S1_vec('10')<= [0, 0, 0, 0]
S1_vec('11')<= [0, 0, 0, 0]
S1_vec('12')<= [0, 0, 0, 0]
S1_vec('13')<= [0, 0, 0, 0]
S1_vec('14')<= [0, 0, 0, 0]
S1_vec('15')<= [0, 0, 0, 0]
S1_vec('0')<= 0
S1_vec('1')<= 0
S1_vec('2')<= 0
S1_vec('3')<= 0
Y:-400
X:-4

IndexError: list assignment index out of range

您可以清楚地看到,数组中没有负索引。这对于正偏移也不能正常工作。循环想要访问偏移索引值,而脚本显然失败了,因为只有在range(var1, var2)的情况下,才会从0到var1创建索引。这毫无意义,因为它应该像:range(starting_point, end_point, steps_if_needed)那样工作。并且复制粘贴for循环语法稍后在脚本的多个实例中成功使用。

是什么导致了这种奇怪的行为,以及如何在不更改代码中数组初始化之外的任何其他内容的情况下修复这种行为?我需要2D阵列在指定区域内精确工作。有简单的解决方案吗?

编辑:

只是为了明确目标:

我需要一个具有负索引功能的2D阵列。范围是已知的,但每个条目都需要定义。附加是无用的,因为它不会为我添加特定的负索引。

如果我例如需要定义矩阵[-4][-120]="0";Jeff";,这需要奏效。我甚至根本不在乎,如果有一个像Bash中那样的解决方案,你必须写矩阵["-4,-120"]。然而,我需要一种合理的方式来处理这些条目。

您可以使用虚拟索引策略来执行同样的操作。这是我的方法:

offset = 5
size = 4
a = [x for x in range(offset,offset+size)]
print(a) # [5, 6, 7, 8]
def get_loc(idx):
return a[idx-offset]
def set_loc(idx, val):
a[idx-offset] = val

set_loc(6,15)
print(a) # [5, 15, 7, 8]
set_loc(8, 112)
print(a) # [5, 15, 7, 112]

这段代码只是为了理解我所说的虚拟索引策略,你可以简单地使用下面的代码来获取和设置值:

# to get a[n] use a[n-offset]
print(a[8-offset]) # 112
# to set a[n] = x | Use a[n-offset] = x
a[7-offset] = 21
print(a) # [5, 15, 21, 112]

相关内容

  • 没有找到相关文章