2014-04-25 5 views
5

में डिक्ट त्रुटि नहीं मिल रही है मूल रूप से मैं अपने दिमाग को अच्छी तरह से रैक कर रहा हूं, क्योंकि अब मेरा कोड क्यों काम नहीं कर रहा है, मैंने अलग-अलग हिस्सों का परीक्षण किया है और पूरे वेब पर देखा है देखें कि क्या इसका कोई फायदा नहीं हुआ है। पूरा कोडपायथन कुंजी त्रुटि = 0 - कोड

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 उपयोग पर विचार करें:

from collections import defaultdict 
:

self.adj = defaultdict(list) 

आप शीर्ष पर आयात करना होगा:

self.adj = {} 
इस के साथ

अब KeyError,बढ़ाने के बजायसंलग्न करने के लिए स्वचालित रूप से एक सूची बना देगा।

0

डिफ़ॉल्ट डिक्शन समाधान बेहतर है। लेकिन पूर्णता के लिए आप संलग्न करने से पहले खाली सूची को भी चेक और बना सकते हैं। + लाइनें जोड़ें:

+ if not u in self.adj.keys(): 
+  self.adj[u] = [] 
    self.adj[u].append(edge) 
. 
. 
संबंधित मुद्दे