python列表列表索引超出范围

时间:2013-03-19 13:20:44

标签: python list multidimensional-array outofrangeexception

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

3 个答案:

答案 0 :(得分:3)

这是循环失败的第二次迭代,因为它将xy设置为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()

A difference highlighter


说明:

  1. mat = [map(int,line.split(',')) for line in f]
    这是list comprehensionmap是一种内置方法。
  2. start_node ...

    中的for循环
    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]))为我们提供了该行中每列的索引。
    3. 在您的代码中,您正在递增x和y(分别为i2i1),因此对角移动。