Ashi
Al atravesar 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. Código fuente: http://cs.mwsu.edu/~terry/courses/4883/lectures/graphs.html
¿Por qué recibo este error y cómo puedo solucionarlo?
johnnyrose
has_key
fue eliminado en Python 3. Desde el documentación:
- Remoto
dict.has_key()
– utilizar elin
operador en su lugar.
Aquí hay un ejemplo:
if start not in graph:
return None
-
pienso
key not in d.keys()
es probable mucho más lento, también, ya quekey not in d
debería ser una búsqueda O (1) y creokeys
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 al respecto: aún podría ser una búsqueda hash– Adam Smith
16 de noviembre de 2015 a las 2:55
-
@AdamSmith no en Python 3,
d.keys()
es una vista que implementa la mayor parte de la interfaz establecida.– Antti Haapala — Слава Україні
24 de enero de 2017 a las 16:24
-
Se eliminó… pero ¿por qué? Ya que hace que el puerto de python 2 a python 3 tenga más trabajo por hacer.
– 林果皞
8 de agosto de 2018 a las 15:59
-
@林果皞: El objetivo principal de una nueva versión principal es que los desarrolladores pueden introducir mejoras que pueden incluir cambios importantes en lugar de tener que admitir funciones antiguas a medida que el lenguaje madura. Este es siempre un riesgo que debe tenerse en cuenta antes de actualizar a una nueva versión principal. En este caso,
in
es más corto y más pitónico, además de ser consistente con otras colecciones en el idioma.– johnnyrose
8 de agosto de 2018 a las 16:26
En python3, has_key(key)
es reemplazado por __contains__(key)
Probado en python3.7:
a = {'a':1, 'b':2, 'c':3}
print(a.__contains__('a'))
-
Creo que esta es la forma correcta y más fácil de hacerlo. Gracias por la respuesta.
– KK2491
19 de enero a las 17:29
tiene_clave ha quedado en desuso en Pitón 3.0. Alternativamente, puede usar ‘en’
graph={'A':['B','C'],
'B':['C','D']}
print('A' in graph)
>> True
print('E' in graph)
>> False
Creo que se considera “más pitónico” simplemente usar in
al determinar si una clave ya existe, como en
if start not in graph:
return None
oana roxana
El código completo en el documento será:
graph = {'A': ['B', 'C'],
'B': ['C', 'D'],
'C': ['D'],
'D': ['C'],
'E': ['F'],
'F': ['C']}
def find_path(graph, start, end, path=[]):
path = path + [start]
if start == end:
return path
if start not in graph:
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
Después de escribirlo, guarde el documento y presione F 5
Después de eso, el código que ejecutará en Python IDLE Shell será:
find_path(gráfico, ‘A’, ‘D’)
La respuesta que debe recibir en IDLE es
['A', 'B', 'C', 'D']
¿Posible duplicado de ‘has_key()’ o ‘in’?
– Pedro Madera
16 de noviembre de 2015 a las 6:22