2016-12-28 268 views
-4

我正在使用python實現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實例是相等的。