我已经读过一个数字矩阵,我正在尝试使用每个单元格并对每个单元格进行测试。如果数字是!= 0我想使用它,所以如果它是0我正在递增x和y以找到非零数字。
最后,我将首先查看顶行,然后如果它们全部为0,则开始向下看第一列,只要我指的是一行(行或列),这就可以正常工作。
为什么我收到此错误?我是否错误地思考了如何设置单元格或者我的代码是错误的?
矩阵看起来像这样:
0,2,4,1,6,0,0
2,0,0,0,5,0,0
4,0,0,0,0,5,0
1,0,0,0,1,1,0
6,5,0,1,0,5,5
0,0,5,1,5,0,0
0,0,0,0,5,0,0
当我开始尝试这样做时:
y = y + 5
x = x + 5
node = Alist[x][y]
我接到一个错误说:
node = Alist[x][y]
IndexError: list index out of range
如果我要写:
y = y + 5
node = Alist[x][y]
print node
它可以完全正常但是当我同时引入x和y时,我开始得到列表索引超出范围问题。在我看来,现在应该读到:
node = Alist[5][5]
如果您按照矩阵<0>,则为0
def create_matrix(file):
with open('network.txt') as f:
Alist = []
for line in f:
part = []
for x in line.split(','):
part.append(int(x))
Alist.append(part)
return Alist
#used to set the start node, used once
def start_node(Alist):
x=0
y=0
#point node to pos [0][0] of Alist
node = Alist[x][y]
#test if node == 0
while node == 0:
y = y + 5
x = x + 5
node = Alist[x][y]
#create a list to hold co-ordinates
if node != 0:
#return node for processing by check_neighbours
return node, x, y
#def current_node(Alist, x, y)
#test neighbours to see if they can be used
def check_neighbours(node, Alist, i, j):
#print out values of x and y
print "x = %d" %i
print "y = %d" % j
print "node in check_neighbours is " + str(node)
#running of code begins here
def main():
file = ("F:/media/KINGSTON/Networking/network.txt")
Alist = create_matrix(file)
node, x, y = start_node(Alist)
check_neighbours(node, Alist, x, y)
main()
答案 0 :(得分:3)
这是循环失败的第二次迭代,因为它将x
和y
设置为10,每个维度中只有7个项目。
你的循环while node == 0:
一次向下移动矩阵的对角线五步,从结束处掉下来。即使它一次只有一个,它也会掉线,因为那个对角线都是零。
也许你的意思是if node == 0
?
我不知道代码实际上要做什么,但你需要重新考虑算法。 : - )
答案 1 :(得分:2)
如果我在start_node
中关注您的代码,那么
a)不执行任何类型的边界检查
和
b)向下跳过矩阵的对角元素,这些元素都是零,直到你越界,正如你的错误告诉你的那样。据推测,当你只递增一个指数时,你很幸运,因为你在越界之前达到了非零元素
答案 2 :(得分:2)
在此代码中,start_node
返回第一个非零“节点”
我使用mat
代替Alist
因为我觉得它更像Pythonic
评论请注意更改和提示。
def create_matrix(fname): # don't use built-ins as variable names!!
with open(fname) as f: # you take filename in arguments, but don't use it..
# why not use in-built functions and list comprehensions ?
mat = [map(int,line.split(',')) for line in f]
return mat
#used to set the start node, used once
def start_node(mat):
# for each row in matrix (index)..
for i1 in range(len(mat)):
# for each cell in row (index)..
for i2 in range(len(mat[i1])):
# mat[i1][i2] is the node/cell..
if mat[i1][i2] != 0:
# return node, x, y :)
return mat[i1][i2], i2, i1
# test neighbours to see if they can be used
# same as yours
def check_neighbours(node, Alist, i, j):
#print out values of x and y
print "x = %d" % (i,)
print "y = %d" % (j,)
print "node (in check_neighbours) is " + str(node)
#running of code begins here
def main():
fname = "F:/media/KINGSTON/Networking/network.txt"
mat = create_matrix(fname)
node, x, y = start_node(mat)
check_neighbours(node, mat, x, y)
main()
说明:
mat = [map(int,line.split(',')) for line in f]
start_node
...
for i1 in range(len(mat)): # 1
for i2 in range(len(mat[i1])): # 2
len(mat)
是矩阵中的行数
range(len(mat))
为我们提供了每行的索引。len(mat[i1])
给出了当前行的长度
range(len(mat[i1]))
为我们提供了该行中每列的索引。在您的代码中,您正在递增x和y(分别为i2
和i1
),因此对角移动。