Class method returns None

Advertisements

I did a few modifications to the Bellman-Ford to get some data I need to compare but I can’t seem to be able to get some of the information I need from the return the PrintArr method, while it prints the ‘dist_list’ the return won’t take it nor am I being able to create the object using list comprehension either.

Class Graph:

def __init__(self, vertices):
    self.V = vertices
    self.graph = []

def addEdge(self, u, v, w):
    self.graph.append([u, v, w])
     
def printArr(self, dist, src):
    #print("Source  End     Distance")
    dist_list = []
    for i in range(self.V):
        #print("{0}\t{1}\t{2}".format(src, i, dist[i]))
        #print(src, i, dist[i])
        dist_list.append([src, i, dist[i]])
    print(dist_list)
    print(dist_list == [[src, i, dist[i]] for i in range(self.V)])
    return [[src, i, dist[i]] for i in range(self.V)]

 
def BellmanFord(self, src):

    dist = [float("Inf")] * self.V
    dist[src] = 0

    for _ in range(self.V - 1):
        for u, v, w in self.graph:
            if dist[u] != float("Inf") and dist[u] + w < dist[v]:
                    dist[v] = dist[u] + w

    for u, v, w in self.graph:
        if dist[u] != float("Inf") and dist[u] + w < dist[v]:
            print("Graph contains negative weight cycle")
            return
                     
    self.printArr(dist, src)


matrix = [[0, 2, 2, 2, -1], [9, 0, 2, 2, -1], [9, 3, 0, 2, -1], [9, 3, 2, 0, -1], [9, 3, 2, 2, 0]]

g = Graph(len(matrix))


[[g.addEdge(i, j, element) for j, element in enumerate(array) if i != j] for i, array in enumerate(matrix)]

print(g.BellmanFord(0))

Output:

[[0, 0, 0], [0, 1, 2], [0, 2, 1], [0, 3, 1], [0, 4, -1]]

True

None

Print: OK

List A = List B

Why return None??? What am I missing?

>Solution :

The None comes from:

print(g.BellmanFord(0))

BellmanFord never returns anything useful under any circumstances (it either falls off the end and implicitly returns None, or executes a plain return, which also return None). Remove the print() around the call, and you’ll avoid the None output.

Alternatively, change self.printArr(dist, src) to return self.printArr(dist, src) so it does return something useful (assuming the early return, which should probably be raising an exception rather than silently returning None, isn’t invoked).

Leave a ReplyCancel reply