web-dev-qa-db-ja.com

'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

なぜこのエラーが発生するのですか?どうすれば修正できますか?

63
Ashi

has_keyはPythonで削除されました3. ドキュメント から:

  • dict.has_key()を削除しました–代わりにin演算子を使用してください。

以下に例を示します。

if start not in graph:
    return None
127
johnnyRose

has_keyPython 3.で非推奨になりました。あるいは、'in'を使用できます

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

print('A' in graph)
>> True

print('E' in graph)
>> False
6

次のように、キーが既に存在するかどうかを判断するときにinを使用することは「よりPythonic」と見なされると思います

if start not in graph:
    return None
5
Kevin S

ドキュメント内のコード全体は次のようになります。

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シェルで実行するコードは次のようになります。

find_path(graph、 'A'、 'D')

IDLEで受け取るべき答えは

['A', 'B', 'C', 'D'] 
3
Oana Roxana

Python3では、has_key(key)__contains__(key)に置き換えられます

Python3.7でテスト済み:

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