#python #graph #typeerror #callable
#python #График #ошибка типа #вызываемый
Вопрос:
Привет всем, я не могу понять, как исправить эту проблему, и, насколько мне известно, это связано с атрибутами объекта, который я использую.
К вашему сведению, я создаю график на Python, и график должен проверять, соединены ли все вершины и ребра.
class graph(object):
def __init__(self, gdict=None):
if gdict == None:
gdict = {}
self.gdict = gdict
# return the keys of the dictionary list, or vertices
def getVertice(self):
return list(self.gdict.keys())
# this allows us to obtain the edges for the graph
# or "values" of the dict key
def getEdges(self):
return self.generate_edges()
def addVertex(self, vertex):
if vertex not in self.gdict:
self.gdict[vertex] = []
def addEdge(self, edge):
edge = set(edge)
(vertex1, vertex2) = tuple(edge)
if vertex1 in self.gdict:
self.gdict[vertex1].append(vertex2)
else:
self.gdict[vertex1] = [vertex2]
# this generates a list of all edges for the vertices
def generate_edges(self):
edges = []
for vertex in self.gdict:
for neighbour in self.gdict[vertex]:
if (neighbour, vertex) not in edges:
edges.append((vertex, neighbour))
return edges
def find_path(self, startVertex, endVertex, paths=None):
if paths == None:
paths = []
graphs = self.gdict
paths = paths [startVertex]
if startVertex == endVertex:
return paths
if startVertex not in graphs:
return None
for vertex in graphs[startVertex]:
if vertex not in paths:
extendedPath = self.find_path(vertex, endVertex, paths)
if extendedPath:
return extendedPath
return None
def findAllPath(self, startVertex, endVertex, paths=None):
if paths is None:
paths = []
graphs = self.gdict
paths = paths [startVertex]
if startVertex == endVertex:
return [paths]
if startVertex not in graphs:
return []
paths = []
for vertex in graphs[startVertex]:
if vertex not in paths:
extendedPath = self.find_path(vertex, endVertex, paths)
for p in extendedPath:
paths.append(p)
return paths
def findisovertices(self): ##reword this
""" returns a list of isolated vertices. """
graphs = self.gdict
iso = []
for vertex in graphs:
print(iso, vertex)
if not graphs[vertex]:
iso = [vertex]
return iso
def isConnected(self, verticesMet=None, startVertex=None):
if verticesMet is None:
verticesMet = set()
gdict = self.gdict
vertices = self.gdict()
if not startVertex:
startVertex = vertices[0]
verticesMet.add(startVertex)
if len(verticesMet) != len(vertices):
for vertex in gdict[startVertex]:
if vertex not in verticesMet:
if self.isConnected(verticesMet, vertex):
return True
else:
return True
return False
# this function prints the nodes/vertices in the graph
def completeGraph(self):
Vertex = len(self.gdict.keys())
Edges = len(self.gdict.values())
answer = 2.0 * Edges / (Vertex * (Vertex - 1))
return answer
graph_elements = ({"a": ["d", "f"],
"b": ["c"],
"c": ["b", "c", "d", "e"],
"d": ["a", "c"],
"e": ["c"],
"f": ["a"],
"z": []
})
g = graph(graph_elements)
print("Our vertices are: n", g.getVertice())
print("#1 | Generate list of all edges: n", graph.generate_edges(g))
##2 Function to calculate isolated nodes of graph.
isolated = graph.findisovertices(g)
print("#2 | Find isolated nodes:n", isolated)
# 3. Function to find a path from a start vertex to an end vertex
path = graph.find_path(g, "a", "c")
print("#3 | Find a path function: n", path)
# 4. Function to find all the paths between a start vertex to an end vertex
allPaths = graph.findAllPath(g, "a", "e")
print("#4 | All paths function:n", allPaths)
# 5. Function to check if graph is connected
connect = graph(g)
print("#5 | Connected graph function n", connect.isConnected(g))
и я продолжаю получать следующую ошибку:
Traceback (most recent call last):
File "graphsAssign6.py", line 160, in <module>
print("#5 | Connected graph function n", connect.isConnected(g))
File "graphsAssign6.py", line 95, in isConnected
vertices = self.gdict()
TypeError: 'graph' object is not callable
Комментарии:
1. Я смог запустить ваш код. Пожалуйста, убедитесь, что у вас нет других переменных с тем же именем,
graph
которые вызывают затенение объекта2. Вы запускали его со своим собственным набором точек? Я не могу поверить, что это проблема, я плачу
3. Я запустил точно такой же код, который у вас есть выше!
4. Есть ли у вас в файле какой-либо другой фрагмент кода, который вы не вставили выше?
5. Это должно быть просто
vertices = self.gdict
Ответ №1:
def isConnected(self, verticesMet=None, startVertex=None):
if verticesMet is None:
verticesMet = set()
gdict = self.gdict
vertices = self.getVertice()
if not startVertex:
startVertex = vertices[0]
verticesMet.add(startVertex)
if len(verticesMet) != len(vertices):
for vertex in gdict[startVertex]:
if vertex not in verticesMet:
if self.isConnected(verticesMet, vertex):
return True
else:
return True
return False
# 5. Function to check if graph is connected
print("#5 | Connected graph function n", g.isConnected())
Не создавайте новый connect = graph(g) . Ваш isConnected должен работать в g. Кроме того, вы не должны получать свои вершины с помощью self.gdict() . Это не имеет смысла, и у вас уже есть функция с именем getVertice для этой работы.
Комментарии:
1. Почему бы и нет? OP создал график графика, выполнив connect = graph(g) . Для меня это не имеет особого смысла.
2. Ошибка
self.gdict()
в том, что я не понимаю, как создание новогоconnect = graph(g)
связано с этим.3. Большое вам спасибо! он действительно запустился, я думаю, что мой оператор печати был неправильным. Я пробовал функцию getVertice раньше, однако, поскольку я печатал ее неправильно, она все равно не работала.