2016-12-01 203 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的所有元素的列表)。在這個主題上可能有很多變體:最後一個元素,兩個元素,...

相關問題