En parcourant un graphique en Python, je reçois cette erreur:
L'objet 'dict' n'a pas d'attribut 'has_key'
Voici mon code:
def find_path(graph, start, end, path=[]):
path = path + [start]
if start == end:
return path
if not graph.has_key(start):
return None
for node in graph[start]:
if node not in path:
newpath = find_path(graph, node, end, path)
if newpath: return newpath
return None
Le code vise à trouver les chemins d'un nœud à d'autres. Source du code: http://cs.mwsu.edu/~terry/courses/4883/lectures/graphs.html
Pourquoi est-ce que j'obtiens cette erreur et comment puis-je la corriger?
if not start in graph:
Réponses:
has_key
a été supprimé dans Python 3. De la documentation :Voici un exemple:
la source
key not in d.keys()
c'est probablement beaucoup plus lent aussi, carkey not in d
devrait être une recherche O (1) et je crois qu'ellekeys
produit une liste, qui est une recherche O (n) (sans parler de la prise d'espace supplémentaire en mémoire). Je pourrais me tromper à ce sujet - il pourrait encore s'agir d'une recherche hachéed.keys()
est une vue qui implémente la plupart de l'interface définie.in
est plus court et plus pythonique, tout en étant cohérent avec d'autres collections de la langue.has_key est obsolète dans Python 3.0 . Vous pouvez également utiliser «in»
la source
En python3,
has_key(key)
est remplacé par__contains__(key)
Testé en python3.7:
la source
Je pense qu'il est considéré comme "plus pythonique" de l'utiliser uniquement
in
pour déterminer si une clé existe déjà, comme dansla source
in
mot - clé, votre intention n'est peut-être pas assez claire. Qu'est-ce que celaif start not in graph:
signifie? peut êtregraph
est une liste et il vérifie s'il n'y a pas une telle chaîne dans la liste? D'autre part, si vous utilisez une syntaxe commehas_key
(maintenant obsolète) ou du moins,in graph.keys()
il est plus clair quegraph
c'estdict
L'ensemble du code du document sera:
Après l'avoir écrit, enregistrez le document et appuyez sur F 5
Après cela, le code que vous exécuterez dans le shell Python IDLE sera:
find_path (graphique, 'A', 'D')
La réponse que vous devriez recevoir dans IDLE est
la source
Essayer:
Pour plus d'informations, voir ProgrammerSought
la source