2017-06-15 113 views
1

我正在嘗試使用dijkstra算法的最短路徑查找器,但它似乎不工作。無法弄清楚問題所在。這裏是代碼和錯誤消息。 (我正在Python的3.5 https://www.youtube.com/watch?v=LHCVNtxb4ss如何糾正錯誤'AttributeError:'dict_keys'對象沒有屬性'remove''?

graph = { 
    'A': {'B': 10, 'D': 4, 'F': 10}, 
    'B': {'E': 5, 'J': 10, 'I': 17}, 
    'C': {'A': 4, 'D': 10, 'E': 16}, 
    'D': {'F': 12, 'G': 21}, 
    'E': {'G': 4}, 
    'F': {'E': 3}, 
    'G': {'J': 3}, 
    'H': {'G': 3, 'J': 3}, 
    'I': {}, 
    'J': {'I': 8}, 
} 

def dijkstra(graph, start, end): 
    D = {} 
    P = {} 
    for node in graph.keys(): 
     D[node]= -1 
     P[node]="" 
    D[start]=0 
    unseen_nodes=graph.keys() 
    while len(unseen_nodes) > 0: 
     shortest=None 
     node=' ' 
     for temp_node in unseen_nodes: 
      if shortest==None: 
       shortest = D[temp_node] 
       node = temp_node 
      elif D[temp_node]<shortest: 
        shortest=D[temp_node] 
        node=temp_node 
     unseen_nodes.remove(node) 
     for child_node, child_value in graph[node].items(): 
      if D[child_node] < D[node] + child_value: 
       D[child_node] = D[node] + child_value 
       P[child_node]=node 
    path = [] 
    node = end 
    while not (node==start): 
     if path.count(node)==0: 
      path.insert(0, node) 
      node=P[node] 
     else: 
      break 
    path.insert(0, start) 
    return path 

AttributeError的: 'dict_keys' 對象沒有屬性 '刪除'

回答

5

在Python 3,dict.keys()返回a dict_keys object (a view of the dictionary)不具有remove方法;不像Python 2,其中dict.keys()返回一個列表對象。

>>> graph = {'a': []} 
>>> keys = graph.keys() 
>>> keys 
dict_keys(['a']) 
>>> keys.remove('a') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'dict_keys' object has no attribute 'remove' 

您可以使用list(..)拿到鑰匙名單:

>>> keys = list(graph) 
>>> keys 
['a'] 
>>> keys.remove('a') 
>>> keys 
[] 

unseen_nodes = graph.keys() 

unseen_nodes = list(graph) 
相關問題