'dict'개체에 'has_key'속성이 없습니다.


105

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:
피터 우드

답변:


180

has_keyPython 3에서 제거되었습니다. 문서에서 :

  • 제거됨 dict.has_key()in대신 연산자를 사용합니다 .

예를 들면 다음과 같습니다.

if start not in graph:
    return None

1
내 생각 엔 key not in d.keys()아마도 많이 , 너무 느린부터 key not in d해야 될 O (1) 조회 내가 생각 keysO (N) 조회 (메모리에 여분의 공간을 가지고 말할 것도없고)입니다 목록을 생성합니다. 그것은 여전히 조회 해시 수 있습니다 -하지만 나는 그것에 대해 잘못 될 수
아담 스미스 (Adam Smith)을

3
Python 3에없는 @AdamSmith d.keys()는 대부분의 set 인터페이스를 구현하는 뷰입니다.
Antti Haapala

3
제거되었는데 ... 왜? python 2 port to python 3 더 많은 작업을 수행합니다.
과일

1
@ 林果 皞 : 새로운 메이저 버전의 요점은 개발자가 언어가 성숙함에 따라 이전 기능을 지원할 필요없이 주요 변경 사항을 포함 할 수있는 개선 사항을 도입 할 수 있다는 것입니다. 이것은 항상 새로운 주요 버전으로 업그레이드하기 전에 고려해야하는 위험입니다. 이 경우, in더 짧고 더 파이썬적일뿐만 아니라 언어의 다른 컬렉션과 일치합니다.
johnnyRose

23

has_keyPython 3.0 에서 더 이상 사용되지 않습니다 . 또는 'in'을 사용할 수 있습니다.

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

print('A' in graph)
>> True

print('E' in graph)
>> False

17

python3에서 다음 has_key(key)으로 대체됩니다.__contains__(key)

python3.7에서 테스트되었습니다.

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

5

in키가 이미 존재하는지 결정할 때 사용하는 것이 "더 비단뱀 적"이라고 생각합니다 .

if start not in graph:
    return None

The Zen of Python (PEP 20)에 따르면 확실하지 않습니다. "명시적인 것이 암시적인 것보다 낫다". in키워드 를 사용하면 if start not in graph:의미 가 명확하지 않을 수 있다고 생각합니다 . 일 수 있고 graph목록에 그러한 문자열이 없는지 확인합니다. 다른 한편으로는, 당신은 같은 구문을 사용하는 경우 has_key(현재 사용되지 않음) 또는 적어도 in graph.keys()더 분명 그 graphA는dict
Amitay 드러머

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

작성한 후 문서를 저장하고 F5를 누릅니다.

그 후 Python IDLE 셸에서 실행할 코드는 다음과 같습니다.

find_path (그래프, 'A', 'D')

IDLE에서 받아야 할 답변은

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

구체적으로 재귀 부분에 대해 설명해 주시겠습니까?
암호로 바꾸다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.