Al recorrer un gráfico en Python, recibo este error:
El objeto 'dict' no tiene atributo 'has_key'
Aquí está mi código:
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
El código tiene como objetivo encontrar las rutas de un nodo a otros. Fuente del código: http://cs.mwsu.edu/~terry/courses/4883/lectures/graphs.html
¿Por qué recibo este error y cómo puedo solucionarlo?
python
python-3.x
dictionary
Ashi
fuente
fuente
if not start in graph:
Respuestas:
has_key
fue eliminado en Python 3. De la documentación :He aquí un ejemplo:
fuente
key not in d.keys()
probablemente también sea mucho más lento, ya quekey not in d
debería ser una búsqueda O (1) y creo quekeys
produce una lista, que es una búsqueda O (n) (sin mencionar que ocupa espacio adicional en la memoria). Sin embargo, podría estar equivocado en eso, podría ser una búsqueda hashd.keys()
es una vista que implementa la mayor parte de la interfaz establecida.in
es más corto y más pitónico, además de ser coherente con otras colecciones del idioma.has_key ha quedado obsoleto en Python 3.0 . Alternativamente, puede usar 'en'
fuente
En python3,
has_key(key)
se reemplaza por__contains__(key)
Probado en python3.7:
fuente
Creo que se considera "más pitónico" usarlo
in
para determinar si una clave ya existe, como enfuente
in
palabra clave, su intención podría no ser lo suficientemente clara, ¿quéif start not in graph:
significa? puede sergraph
una lista y verifica si no hay tal cadena en la lista? Por otro lado, si usa una sintaxis comohas_key
(ahora en desuso) o al menosin graph.keys()
está más claro quegraph
es undict
El código completo en el documento será:
Después de escribirlo, guarde el documento y presione F 5
Después de eso, el código que ejecutará en el shell de Python IDLE será:
find_path (gráfico, 'A', 'D')
La respuesta que debe recibir en IDLE es
fuente
Tratar:
Para obtener más información, consulte ProgrammerSought
fuente