2016-12-28 1 views
-4

저는 Dijkstra의 알고리즘을 파이썬으로 구현하고 있는데, 목록에서 객체의 인스턴스를 어떻게 제거 할 수 있을지 궁금합니다. 다음은 내 코드에서 "list.remove (x) : x not in list"오류가있는 부분입니다. 해당 항목이 제거 싶어 무엇이든 동일입니다python으로 목록에서 객체의 인스턴스를 제거하는 방법은 무엇입니까?

class Vertex: 
    def __init__(self, id, name): 
     self.id = id 
     self.name = name 
     self.minDistance = float("inf") 
     self.previousVertex = None 
     self.edges = [] 

    def computePath(self, sourceId): 
     for i in self.vertexes: 
      if i.id == sourceId: 
       startVertex = i 
       startVertex.minDistance=0 
       break 
      else: 
       continue 
     unvisited = [] 
     for vertex in self.vertexes: 
      unvisited.append(vertex) 
     while len(unvisited)!=0: 
      self.visited.append(startVertex) 
      unvisited.remove(startVertex) 
+0

루프에서 계속해서 'startVertex'를 계속 제거하려고합니다. – user2357112

+0

또한'pop()'은 목록에서 물건을 제거하는 좋은 기능입니다. – MooingRawr

+0

@MooingRawr 그래서'.remove'를합니다 –

답변

1

list.remove() 목록에서 첫 번째 항목을 제거합니다. 즉

은, 알고리즘은이 작업을 수행하는 것입니다

def remove(self, item_to_remove): 
    for index, item in enumerate(self): 
     if item == item_to_remove: 
      del self[index] 
      return 
    raise ValueError('list.remove(x): x not in list') 

비결은 다음 == 평등 테스트 통과를 확인하는 것입니다. 이 작업은 __eq__ method으로 수행됩니다. 기본값 인은 두 항목이 이고 동일한 개체가 인 경우에만 True을 반환하므로 item is item_to_remove이 참입니다.

당신은 당신의 Vertex 클래스에 대한 사용자 정의 메소드를 만들 수 있습니다

def __eq__(self, other): 
    if not isinstance(other, Vertex): 
     return NotImplemented 
    return self.id == other.id # refine as needed 

는 두 Vertex 인스턴스가 동일한 경우를 결정해야합니다.

관련 문제