2014-04-25 4 views
5

기본적으로 지금 내 코드가 작동하지 않는 이유에, 나는 별도 부품을 시험하고 웹에 걸쳐 모양에가있는 동안 좋은 내 뇌를 고문 한 그것이 도움이되는지, 아무 소용이 있는지보십시오. 내가 오류를 얻고있다하면 역 추적이 있음 : 오류가있는파이썬 키 오류 = 0 - 코드 DICT 오류를 찾을 수 없습니다

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 

두 부분은 여기

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 

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 #### 

그리고이다되고 완성 된 코드이없이로 무슨 일이 일어나고 있는지 볼 어려울 수 있습니다

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

많은 시간을 내 주셔서 감사 드리며 대단히 감사합니다.

답변

4

당신이지고있어 오류가 self.adj 이미 키 0가없는 것입니다. 아직 존재하지 않는 목록에 추가하려고합니다.

(__init__에서)이 라인을 교체하는 대신 defaultdict 사용을 고려 :

self.adj = defaultdict(list) 

당신은 상단에 가져해야합니다 :

from collections import defaultdict 
이와

self.adj = {} 

이제는 기권하기보다는 KeyError, self.adj[0].append(edge)에 추가 할 목록이 자동으로 생성됩니다.

0

defaultdict 솔루션이 더 좋습니다. 그러나 완성을 위해 추가하기 전에 빈 목록을 확인하고 만들 수도 있습니다. + 라인을 추가하십시오 :

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