在 Python 中遍历图形时,我收到此错误:
'dict' 对象没有属性 'has_key'
这是我的代码:
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
该代码旨在找到从一个节点到其他节点的路径。代码来源:http://cs.mwsu.edu/~terry/courses/4883/lectures/graphs.html
为什么我会收到此错误,我该如何解决?
has_key
在 Python 3 中被删除。从 documentation:
删除了 dict.has_key() - 改用 in 运算符。
这是一个例子:
if start not in graph:
return None
在 python3 中,has_key(key)
被替换为 __contains__(key)
在python3.7中测试:
a = {'a':1, 'b':2, 'c':3}
print(a.__contains__('a'))
has_key 在 Python 3.0 中已被弃用。或者你可以使用'in'
graph={'A':['B','C'],
'B':['C','D']}
print('A' in graph)
>> True
print('E' in graph)
>> False
我认为在确定密钥是否已经存在时仅使用 in
被认为是“更 Pythonic”,如
if start not in graph:
return None
in
关键字,您的意图可能不够清楚 if start not in graph:
是什么意思?可能 graph
是一个列表,它检查列表中是否没有这样的字符串?另一方面,如果您使用像 has_key
(现已弃用)或至少 in graph.keys()
这样的语法,则更清楚的是 graph
是 dict
文档中的整个代码将是:
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
写完后,保存文档并按F 5
之后,您将在 Python IDLE shell 中运行的代码将是:
查找路径(图,'A','D')
你应该在 IDLE 中收到的答案是
['A', 'B', 'C', 'D']
key not in d.keys()
也可能非常慢,因为key not in d
应该是 O(1) 查找,我相信keys
会产生一个列表,它是 O(n) 查找(不是提到在内存中占用额外空间)。不过我可能错了——它可能仍然是散列查找d.keys()
是实现大部分 set 接口的视图。in
更短,更符合 Python 风格,并且与语言中的其他集合保持一致。