2014-04-25 9 views
5

In pratica mi sono tormentato per un bel po 'ora sul motivo per cui il mio codice non funziona, ho provato le parti separatamente e ho cercato su tutto il web per vedere se può aiutare, senza successo. sto ottenendo un errore che il traceback è:Errore chiave Python = 0 - Impossibile trovare l'errore Dict nel codice

Traceback (most recent call last): 
File "yes2.py", line 62, in <module> 
g.add_edge(row_index,col_index, b) 
File "yes2.py", line 27, in add_edge 
self.adj[u].append(edge) 
KeyError: 0 

Le due parti con errori sono

def add_edge(self, u, v, w=0): 
    if u == v: 
     raise ValueError("u == v") 
    edge = Edge(u,v,w) 
    redge = Edge(v,u,0) 
    edge.redge = redge 
    redge.redge = edge 
    self.adj[u].append(edge) #### LINE 27 #### 
    self.adj[v].append(redge) 
    self.flow[edge] = 0 
    self.flow[redge] = 0 

e

g = FlowNetwork() 
map(g.add_vertex, ['0','1','2','3','4','5','6']) 
with open('network.txt', "r") as file: 
for row_index, row in enumerate(file): 
    for col_index, value in enumerate(row.split(",")): 
     b = int(value) 
     if b != 0: 
      g.add_edge(row_index,col_index, b) ### LINE 62 #### 

Ed ecco il codice completo, in quanto senza questo potrebbe essere difficile vedere cosa sta succedendo

class Edge(object): 
def __init__(self, u, v, w): 
    self.source = u 
    self.sink = v 
    self.capacity = w 
def __repr__(self): 
    return "%s->%s:%s" % (self.source, self.sink, self.capacity) 

class FlowNetwork(object): 
def __init__(self): 
    self.adj = {} 
    self.flow = {} 

def add_vertex(self, vertex): 
    self.adj[vertex] = [] 

def get_edges(self, v): 
    return self.adj[v] 

def add_edge(self, u, v, w=0): 
    if u == v: 
     raise ValueError("u == v") 
    edge = Edge(u,v,w) 
    redge = Edge(v,u,0) 
    edge.redge = redge 
    redge.redge = edge 
    self.adj[u].append(edge) 
    self.adj[v].append(redge) 
    self.flow[edge] = 0 
    self.flow[redge] = 0 

def find_path(self, source, sink, path): 
    if source == sink: 
     return path 
    for edge in self.get_edges(source): 
     residual = edge.capacity - self.flow[edge] 
     if residual > 0 and not (edge,residual) in path: 
      result = self.find_path(edge.sink, sink, path + [(edge,residual)]) 
      if result != None: 
       return result 

def max_flow(self, source, sink): 
    path = self.find_path(source, sink, []) 
    while path != None: 
     flow = min(res for edge,res in path) 
     for edge,res in path: 
      self.flow[edge] += flow 
      self.flow[edge.redge] -= flow 
     path = self.find_path(source, sink, []) 
    return sum(self.flow[edge] for edge in self.get_edges(source)) 

g = FlowNetwork() 
map(g.add_vertex, ['0','1','2','3','4','5','6']) 
with open('network.txt', "r") as file: 
# enumerate allows you to iterate through the list with an index and an object 
for row_index, row in enumerate(file): 
    # split allows you to break a string apart with a string key 
    for col_index, value in enumerate(row.split(",")): 
     #convert value from string to int 
     b = int(value) 
     if b != 0: 
      g.add_edge(row_index,col_index, b) 

print g.max_flow('1','6') 

Mille grazie per il vostro tempo, molto apprezzato.

risposta

4

L'errore che si ottiene è che self.adj non ha già una chiave 0. Stai provando ad aggiungere a un elenco che non esiste ancora.

Considerare l'utilizzo di un defaultdict, invece, in sostituzione di questa linea (in __init__):

self.adj = {} 

con questo:

self.adj = defaultdict(list) 

Avrai bisogno di importare in alto:

from collections import defaultdict 

Ora piuttosto che aumentare un KeyError, self.adj[0].append(edge) creerà automaticamente una lista da aggiungere a.

0

La soluzione predefinita è migliore. Ma per completezza è anche possibile controllare e creare una lista vuota prima dell'append. Aggiungere le + linee:

+ if not u in self.adj.keys(): 
+  self.adj[u] = [] 
    self.adj[u].append(edge) 
. 
. 
Problemi correlati