ChatGPT解决这个技术问题 Extra ChatGPT

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

在 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()' or 'in'? 的可能重复项

j
johnnyRose

has_key 在 Python 3 中被删除。从 documentation

删除了 dict.has_key() - 改用 in 运算符。

这是一个例子:

if start not in graph:
    return None

我认为 key not in d.keys() 也可能非常慢,因为 key not in d 应该是 O(1) 查找,我相信 keys 会产生一个列表,它是 O(n) 查找(不是提到在内存中占用额外空间)。不过我可能错了——它可能仍然是散列查找
@AdamSmith 不在 Python 3 中,d.keys() 是实现大部分 set 接口的视图。
它删除了...但是为什么呢?因为它使 python 2 移植到 python 3 更多的工作要做。
@林果皞:新主要版本的全部意义在于开发人员可以引入改进,其中可能包括重大更改,而不必随着语言的成熟而支持旧功能。在升级到新的主要版本之前,这始终是一个必须考虑的风险。在这种情况下,in 更短,更符合 Python 风格,并且与语言中的其他集合保持一致。
q
qloveshmily

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

在python3.7中测试:

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

我认为这是正确且更简单的方法,谢谢您的回答
A
Abhishek Pansotra

has_key 在 Python 3.0 中已被弃用。或者你可以使用'in'

graph={'A':['B','C'],
   'B':['C','D']}

print('A' in graph)
>> True

print('E' in graph)
>> False

K
Kevin S

我认为在确定密钥是否已经存在时仅使用 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
G
Godfrey

尝试:

if start not in graph:

有关详细信息,请参阅 ProgrammerSought


O
Oana Roxana

文档中的整个代码将是:

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'] 

你能解释一下吗?特别是递归部分。