0

私は数値の行列を読み込んでおり、各セルを操作して各セルでテストを実行しようとしています。数値が != 0 の場合はそれを使用したいので、0 の場合は現在 x と y をインクリメントしてゼロ以外の数値を見つけています。

最後に、最初に一番上の行を調べてから、それらがすべて 0 の場合は最初の列を見下ろします。これは、1 つだけ (行または列) を参照している限り、正常に機能します。

このエラーが表示されるのはなぜですか? セルの設定方法について間違った考えを持っているのでしょうか、それともコードが間違っていますか?

マトリックスは次のようになります。

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

失敗しているのはループの2回目の反復です。これは、各ディメンションに7つのアイテムしかない10に設定されてxいるためです。y

ループwhile node == 0:は、マトリックスの対角線を一度に5ステップ下に移動し、端から外れます。その対角線はすべてゼロであるため、一度に1つずつ行っても、最後から外れます。

おそらくあなたは意味しましたif node == 0か?

コードが実際に何をしようとしているのかわかりませんが、アルゴリズムを再考する必要があります。:-)

于 2013-03-19T13:27:26.360 に答える
2

私があなたのコードに従えstart_nodeば、

a) いかなる種類の境界チェックも実行しない

b)エラーが示すように、境界を超えるまで、すべてゼロである行列の対角要素を下にジャンプします。おそらく、インデックスの1つだけをインクリメントしている場合、範囲外になる前にゼロ以外の要素にヒットするという点で幸運です

于 2013-03-19T13:25:41.027 に答える
2

このコードでstart_nodeは、ゼロ以外の最初の「ノード」を返します。代わり
に使用したのは、より Pythonic であると感じたからです。 コメントは、変更点とヒントを示しています。matAlist

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 に答える