我该如何纠正错误'AttributeError:'dict_keys'对象没有属性'remove''?

我该如何纠正错误'AttributeError:'dict_keys'对象没有属性'remove''?

问题描述:

我正在尝试使用dijkstra算法的最短路径查找器,但似乎不起作用.无法找出问题所在.这是代码和错误消息. (我正在使用Python 3.5. https://www.youtube.com/watch?v= LHCVNtxb4ss )

I was trying shortest path finder using dijkstra algorithm but It seems not working. Can't figure out what the problem is. Here are the code and the error message. (I'm working on Python 3.5. https://www.youtube.com/watch?v=LHCVNtxb4ss)

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'对象没有属性'remove'

AttributeError: 'dict_keys' object has no attribute 'remove'

在Python 3中, dict.keys() 返回一个dict_keys对象(一个字典视图),其中没有remove方法;与Python 2不同,dict.keys()返回列表对象.

In Python 3, dict.keys() returns a dict_keys object (a view of the dictionary) which does not have remove method; unlike Python 2, where dict.keys() returns a list object.

>>> 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(..)来获取按键列表:

You can use list(..) to get a keys list:

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


unseen_nodes = graph.keys()

unseen_nodes = list(graph)