0

別の関数にリストを入力できるように、関数から引数を渡す方法を理解する方法に苦労しています-私のコードは次のとおりです:

 infinity = 1000000 
 invalid_node = -1 
 startNode = 0

#Values to assign to each node 
class Node:
     distFromSource = infinity
     previous = invalid_node
     visited = False

#read in all network nodes 
def network():
    f = open ('network.txt', 'r')
    theNetwork = [[int(node) for node in line.split(',')] for line in f.readlines()]
    print theNetwork

    return theNetwork

#for each node assign default values 
def populateNodeTable(): 
    nodeTable = []
    index = 0
    f = open('network.txt', 'r')
    for line in f: 
      node = map(int, line.split(',')) 
      nodeTable.append(Node())

      print "The previous node is " ,nodeTable[index].previous 
      print "The distance from source is " ,nodeTable[index].distFromSource 
      index +=1
    nodeTable[startNode].distFromSource = 0 

    return nodeTable

#find the nearest neighbour to a particular node 
def nearestNeighbour(currentNode, theNetwork):
     nearestNeighbour = []
     nodeIndex = 0
     for node in nodeTable:
          if node != 0 and currentNode.visited == false:
             nearestNeighbour.append(nodeIndex)
             nodeIndex +=1

     return nearestNeighbour

  currentNode = startNode

if __name__ == "__main__":
    nodeTable = populateNodeTable()
    theNetwork = network()
    nearestNeighbour(currentNode, theNetwork)

そのため、最も近いNeighbour関数の最も近いNeighbourリストに、他のノードに最も近いノードのリストを入力しようとしています。これで、他のすべての関数が正しく機能し、すべての引数の受け渡しが正常に機能します。ただし、私のneastNeighbour関数は次のエラーメッセージをスローします。

ノード!=0およびtheNetwork[currentNode] .visited == falseの場合:AttributeError:'list'オブジェクトに属性'visited'がありません

(レイアウトについてお詫びしますが、コード引用符の使用についてはまだ十分に理解していません)

4

3 に答える 3

1

これ theNetwork[currentNode]は、リストを返すためです。言い換えれば、:theNetworkはリストのリストです。

これはそれが行われる行です:

theNetwork = [[int(node) for node in line.split(',')] for line in f.readlines()]
于 2011-03-11T00:33:00.090 に答える
1
class Node(object):
    def __init__(self, me, dists):
        super(Node,self).__init__()
        self.me = me
        self.dists = dists
        _inf = Network.INF
        self.neighbors = sorted((i for i,dist in enumerate(self.dists) if i!=me and dist!=_inf), key=dists.__getitem__)
        self.clear()

    def clear(self):
        self.dist = None
        self.prev = None

    def nearestNeighbor(self):
        try:
            return self.neighbors[0]
        except IndexError:
            return None

    def __str__(self):
        return "{0}: {1}".format(self.me, self.dists)

class Network(object):
    INF     = 10**6

    @classmethod
    def fromFile(cls, fname, delim=None):
        with open(fname) as inf:
            return cls([[int(dist) for dist in line.split(delim)] for line in inf])

    def __init__(self, distArray):
        super(Network,self).__init__()
        self.nodes = [Node(me,dists) for me,dists in enumerate(distArray)]

    def __str__(self):
        return '\n'.join(self.nodes)

    def floodFill(self, fromNode):
        _nodes = self.nodes
        for n in _nodes:
            n.clear()
        _nodes[fromNode].dist = 0
        # left as an exercise ;-)

    def distances(self):
        return [n.dist for n in self.nodes]

def main():
    nw = Network.fromFile('network.txt', delim=',')
    print(nw)

    nw.floodFill(fromNode=0)
    print(nw.distances())

if __name__=="__main__":
    main()
于 2011-03-11T05:02:52.257 に答える
0
 theNetwork = [[int(node) for node in line.split(',')] for line in f.readlines()]

theNetworkリストのリストです。リスト( )には属性theNetwork[currentNode]がありません。visited

おそらくあなたは次のようなことを意図していました:

for line in f.readlines():
     theNetwork.extend((int(node) for node in line.split(',')))
于 2011-03-11T00:34:49.410 に答える