'dict'对象没有属性'has_key'


104

在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

为什么会出现此错误,我该如何解决?


2
if not start in graph:
Peter Wood)

Answers:


180

has_key已在Python 3中删除。从文档中

  • 已删除dict.has_key()–请改用in运算符。

这是一个例子:

if start not in graph:
    return None

1
我想,key not in d.keys()大概是慢,也因为key not in d应该是O(1)查找,我相信keys会产生一个列表,这是O(n)查找(更不用说采取额外的内存空间)。我可能是错了,但-它可能仍然被散列查找
亚当·斯密

3
@AdamSmith不是Python 3 d.keys()中的视图,它实现了大多数set接口。
Antti Haapala

3
它删除了...但是为什么呢?由于它使python 2移植到python 3上需要做更多的工作。
水果

1
@林果皞:一个新的主要版本的重点是开发人员可以引入改进,其中可能包括破坏更改,而不必在语言成熟时支持旧功能。在升级到新的主要版本之前,始终必须考虑到这种风险。在这种情况下,它in变得更短,更Pythonic,并且与该语言中的其他集合保持一致。
johnnyRose


17

在python3中,has_key(key)被替换为__contains__(key)

在python3.7中测试:

a = {'a':1, 'b':2, 'c':3}
print(a.__contains__('a'))

5

我认为,仅in在确定某个键是否已存在时才使用它,它被认为是“更多的pythonic” ,如

if start not in graph:
    return None

根据Python之禅(PEP 20)的说法,我不确定:“显式比隐式更好”。我认为如果使用in关键字,您的意图可能不够清楚,这if start not in graph:意味着什么?可能graph是一个列表,它检查列表中是否没有这样的字符串?另一方面,如果您使用类似has_key(现在不建议使用)之类的语法,或者至少使用这样的语法in graph.keys(),则更清楚的graphdict
Amitay Drummer

4

该文档中的整个代码将为:

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中运行的代码为:

find_path(图,'A','D')

您应该在“ IDLE”中收到的答案是

['A', 'B', 'C', 'D'] 

您能否解释一下?特别是递归部分。
加密

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.