2016-12-01 84 views
0

我必须使用邻接列表或矩阵创建图形,并包括添加顶点和边的函数。然而,我仍然在同一行中收到不同的错误。 我得到这个错误在类型错误:列表索引必须是整数,而不是元组

def getConnection(self): 
    return self.Edge[()] 

这正是我与它显示的那样。我试过

return self.Edge() 

return self.Edge[] 

,但我发现其他类型的错误,而不是。我需要在这里更改什么?

#Graph for Reference and use in BFS and DFS 
graph = {'0': ['2'], 
     '1': ['3', '0'], 
     '2': ['3', '4'], 
     '3': ['2', '4', '5'], 
     '4': ['5', '6'], 
     '5': ['6', '7'], 
     '6': ['7', '8'], 
     '7': ['8', '9'], 
     '8': ['9', '0'], 
     '9': ['0', '5'] } 

class Vertex: 

    def __init__(self, Label, Edge): 
     self.Label = 0 
     self.Edge = [] 

    def AddNeighbour(self, neighbour, weight=0): 
     self.Connection[neighbour] = weight 

    def __str__(self): 
     return str(self.Label) + ' connected to: ' + str([i.Label for i in self.Edge]) 

    def getConnection(self): 
     return self.Edge[()] 

    def getLabel(self): 
     return self.Label 

class Graph: 
    def __init__(self): 
     self.VertexList = {} 
     self.NumVertices = 0 

    def AddVertex(self, Label): 
     self.NumVertices = self.NumVertices + 1 
     NewVertex = Vertex(Label, None) 
     self.VertexList[Label] = NewVertex 
     return NewVertex 

    def GetVertex(self,n): 
     if n in self.VertexList: 
      return self.VertexList[n] 
     else: 
      return None 

    def __contains__(self,n): 
     return n in self.VertexList 

    def AddNeighbour(self, neighbour, weight=0): 
     self.Connection[neighbour] = weight 

    def AddEdge(self,f,t,cost=0): 
     if f not in self.VertexList: 
      NewVertex = self.AddVertex(f) 
     if t not in self.VertexList: 
      NewVertex = self.AddVertex(t) 


    def GetVertices(self): 
     return self.VertexList.Label() 

    def __iter__(self): 
     return iter(self.VertexList.values()) 

g = Graph() 
for i in range(10): 
    g.AddVertex(i) 

g.VertexList 

g.AddEdge(0,2,0) 
g.AddEdge(0,3,0) 
g.AddEdge(1,3,0) 
g.AddEdge(1,0,0) 
g.AddEdge(2,3,0) 
g.AddEdge(2,4,0) 
g.AddEdge(3,2,0) 
g.AddEdge(3,4,0) 
g.AddEdge(3,5,0) 
g.AddEdge(4,5,0) 
g.AddEdge(4,6,0) 
g.AddEdge(5,6,0) 
g.AddEdge(5,7,0) 
g.AddEdge(6,7,0) 
g.AddEdge(6,8,0) 
g.AddEdge(7,8,0) 
g.AddEdge(7,9,0) 
g.AddEdge(8,9,0) 
g.AddEdge(8,0,0) 
g.AddEdge(9,0,0) 
g.AddEdge(9,5,0) 

for v in g: 
    for w in v.getConnection(): 
     print("(%s , %s)" % (v.getLabel(), w.getLabel())) 
+2

我想你只是想返回self.Edge。 – jasonharper

+0

你打算通过调用[()]从列表中取回什么?如果你想创建一个新的重复列表,返回列表(self.Edge)或返回self.Edge [:]因为你不修改它,jasonharper的更好。无关的注释 - Graph.AddEdge实际上并不添加边。 –

+0

谢谢你们。而且我知道这不是这个图表的唯一问题,它只是我现在坚持的一个问题。我从来没有这样做过,所以我正在努力一点。你知道我需要做什么才能让Graph.AddEdge实际添加一个节点吗?我删除了我认为我需要的线路,现在我不能为了我的生活而记住它。 –

回答

0

自定义边缘的列表,你可以返回:

  • 列表本身:return self.Edge
  • 列表的副本:return self.Edge[:]
  • 列表中的一个元素:return self.Edge[i]
  • 列表中的一部分:return self.Edge[i:j]

当然,在最后两种情况下,您必须分别定义和初始化i和j。如果不使用,它们将分别表示列表的开始和结束(即self.Egde[:j]会返回一个直到位置j的所有元素的列表)。在这个主题上可能有很多变体:最后一个元素,两个元素,...

相关问题