开发者

Python - Passing Function Arguments

I am struggling on how to work out how I pass arguments from a function so that I can populate a list in another function - my code is:

 infinity = 100开发者_运维技巧0000 
 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)

So, I am trying to fill the nearestNeighbour list in my nearestNeighbour function with a list of nodes nearest to the other nodes. Now, the all the other functions work correctly, with all argument passing functioning as it should. However, my nearestNeighbour function throws up this error message:

if node != 0 and theNetwork[currentNode].visited == false: AttributeError: 'list' object has no attribute 'visited'

(Apologies for the layout, haven't quite fathomed the use of the code quotes yet)


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


That's because theNetwork[currentNode] returns a list. In other words: theNetwork is a list of lists.

This is the line where it is done:

theNetwork = [[int(node) for node in line.split(',')] for line in f.readlines()]


 theNetwork = [[int(node) for node in line.split(',')] for line in f.readlines()]

theNetwork is a list of lists. A list (theNetwork[currentNode]) doesn't have a visited attribute.

Perhaps you intended something like:

for line in f.readlines():
     theNetwork.extend((int(node) for node in line.split(',')))
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜