web-dev-qa-db-fra.com

L'objet 'dict' n'a pas d'attribut 'has_key'

En parcourant un graphique en Python, je reçois cette erreur:

L'objet 'dict' n'a pas d'attribut 'has_key'

Voici mon code:

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

Le code vise à trouver les chemins d'un nœud à d'autres. Source du code: http://cs.mwsu.edu/~terry/courses/4883/lectures/graphs.html

Pourquoi ai-je cette erreur et comment puis-je la réparer?

67
Ashi

has_key a été supprimé de Python 3. Du documentation :

  • Supprimé dict.has_key() - utilisez plutôt l'opérateur in.

Voici un exemple:

if start not in graph:
    return None
132
johnnyRose

has_key est obsolète en Python 3.. Sinon, vous pouvez utiliser 'in'

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

print('A' in graph)
>> True

print('E' in graph)
>> False
7
Abhishek Pansotra

Je pense qu’il est considéré comme "plus Pythonique" de simplement utiliser in pour déterminer si une clé existe déjà, comme dans

if start not in graph:
    return None
5
Kevin S

Le code entier dans le document sera:

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

Après l’avoir écrit, sauvegardez le document et appuyez sur F 5

Après cela, le code que vous exécuterez dans le shell Python IDLE sera:

find_path (graphique, 'A', 'D')

La réponse que vous devriez recevoir dans IDLE est

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

En python3, has_key(key) est remplacé par __contains__(key)

Testé en python3.7:

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