Python Key Error=0 – Kan Dict-fout niet vinden in code

Ik ben eigenlijk al een hele tijd aan het piekeren over de reden waarom mijn code niet werkt. Ik heb onderdelen afzonderlijk getest en heb op internet gezocht of het kan helpen, maar het mocht niet baten.
Ik krijg een foutmelding dat de traceback is:

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

De twee delen met fouten zijn

   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 

en

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

En hier is de voltooide code, want zonder deze kan het moeilijk zijn om te zien wat er gebeurt

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

Hartelijk dank voor uw tijd, zeer gewaardeerd.


Antwoord 1, autoriteit 100%

De foutmelding die je krijgt is dat self.adjnog geen sleutel 0heeft. Je probeert iets toe te voegen aan een lijst die nog niet bestaat.

Overweeg het gebruik van een defaultdictvervang in plaats daarvan deze regel (in __init__):

self.adj = {}

met dit:

self.adj = defaultdict(list)

Je moet bovenaan importeren:

from collections import defaultdict

In plaats van een KeyErrorop te werpen, maakt self.adj[0].append(edge)nu automatisch een lijst om aan toe te voegen.


Antwoord 2, autoriteit 35%

De standaarddict-oplossing is beter.
Maar voor de volledigheid zou je ook kunnen controleren en een lege lijst maken voor de append.
Voeg de + regels toe:

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

Antwoord 3, autoriteit 10%

Het komt alleen wanneer uw lijst of woordenboek niet beschikbaar is in de lokale functie.


Antwoord 4

Probeer dit:

class Flonetwork(Object):
    def __init__(self,adj = {},flow={}):
        self.adj = adj
        self.flow = flow

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes