2016-12-01 1 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

"return self.dge"를 원한다고 생각합니다. – jasonharper

+0

[()] (으)로 전화하여 목록에서 되돌아 가려고 했습니까? 새 중복 목록을 만들려면 list (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까지 모든 요소의 목록을 반환합니다). 이 주제에 대한 다양한 변형이 가능합니다 : 마지막 요소, 두 요소 중 하나 ...

관련 문제