0

我已经阅读了一个数字矩阵,我正在尝试使用每个单元格并对每个单元格进行测试。如果数字是 != 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

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()
4

3 回答 3

3

这是循环失败的第二次迭代,因为它将xand设置y为 10,每个维度中只有 7 个项目。

您的循环while node == 0:一次沿着矩阵的对角线向下移动五步,从末端掉落。即使它一次只去一个,它也会从末端掉下来,因为那个对角线全为零。

也许你的意思是if node == 0

我不知道代码实际上想要做什么,但你需要重新考虑算法。:-)

于 2013-03-19T13:27:26.360 回答
2

如果我遵循你的代码,start_node你就是

a) 不执行任何类型的边界检查

b)跳下矩阵的对角线元素,它们都为零,直到超出界限,正如您的错误告诉您的那样。大概当您只增加一个索引时,您很幸运,因为您在超出界限之前遇到了一个非零元素

于 2013-03-19T13:25:41.027 回答
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()

差异荧光笔


解释:

  1. mat = [map(int,line.split(',')) for line in f]
    这是一个列表理解map是一种内置方法。
  2. 中的 for 循环start_node...

    for i1 in range(len(mat)):         # 1
        for i2 in range(len(mat[i1])): # 2
    
    1. len(mat)是矩阵中的行数。
      range(len(mat))给我们每一行的索引。
    2. len(mat[i1])给我们当前行的长度。
      range(len(mat[i1]))给我们该行中每一列的索引。

    在您的代码中,您同时增加了 x 和 y (此处i2i1分别),因此沿对角线移动。

于 2013-03-19T14:17:07.610 回答