¿Cómo puedo corregir el error ‘AttributeError:’ el objeto ‘dict_keys’ no tiene el atributo ‘eliminar’ ‘?

Estaba intentando encontrar el camino más corto usando el algoritmo dijkstra pero parece que no funciona. No puedo averiguar cuál es el problema. Aquí están el código y el mensaje de error. (Estoy trabajando en 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: el objeto ‘dict_keys’ no tiene ningún atributo ‘eliminar’

En Python 3, dict.keys() devuelve un objeto dict_keys (una vista del diccionario) que no tiene un método de remove ; a diferencia de Python 2, donde dict.keys() devuelve un objeto de lista.

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

Puede usar la list(..) para obtener una lista de claves:

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

 unseen_nodes = graph.keys() 

a

 unseen_nodes = list(graph)