web-dev-qa-db-fra.com

Comment puis-je corriger l'erreur 'AttributeError: l'objet' dict_keys 'n'a pas d'attribut' remove ''?

J'essayais le plus court chemin Finder en utilisant l'algorithme dijkstra, mais cela ne semble pas fonctionner. Je ne peux pas comprendre quel est le problème. Voici le code et le message d'erreur. (Je travaille sur 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: l'objet 'dict_keys' n'a pas d'attribut 'remove'

11
AdKor

Dans Python 3, dict.keys() renvoie n objet dict_keys (une vue du dictionnaire) qui n'a pas remove méthode; contrairement à Python 2, où dict.keys() renvoie un objet liste.

>>> 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'

Vous pouvez utiliser list(..) pour obtenir une liste de clés:

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

unseen_nodes = graph.keys()

à

unseen_nodes = list(graph)
23
falsetru