2011-03-11 6 views
0

Je me bats sur la façon de comprendre comment je passe les arguments d'une fonction afin que je puisse remplir une liste dans une autre fonction - mon code est:Python - Passage Fonction Arguments

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) 

Donc, je suis en train pour remplir la liste des voisins les plus proches dans ma fonction plus proche du voisinage avec une liste des nœuds les plus proches des autres nœuds. Maintenant, toutes les autres fonctions fonctionnent correctement, avec tous les arguments passant à fonctionner comme il se doit. Cependant, ma fonction nearestNeighbour vomit ce message d'erreur:

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

(Toutes mes excuses pour la mise en page, n'a pas tout à fait sondée l'utilisation du code cite encore)

Répondre

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

C'est parce que theNetwork[currentNode] retourne une liste. En d'autres termes: theNetwork est une liste de listes.

Ceci est la ligne où il est fait:

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

theNetwork est une liste de listes. Une liste (theNetwork[currentNode]) n'a pas un attribut visited.

Peut-être que vous vouliez quelque chose comme:

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

Ah ok, j'ai essayé et je reçois un message d'erreur - est-il possible de travailler avec ce que j'ai, mais il suffit de changer le code dans mon nearestNeighbour fonction? – user612041

Questions connexes