Das Objekt 'dict' hat kein Attribut 'has_key'.

104

Beim Durchlaufen eines Diagramms in Python wird folgende Fehlermeldung angezeigt:

Das Objekt 'dict' hat kein Attribut 'has_key'.

Hier ist mein 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

Der Code zielt darauf ab, die Pfade von einem Knoten zu anderen zu finden. Codequelle: http://cs.mwsu.edu/~terry/courses/4883/lectures/graphs.html

Warum erhalte ich diesen Fehler und wie kann ich ihn beheben?

Ashi
quelle
2
if not start in graph:
Peter Wood
1
Mögliches Duplikat von 'has_key ()' oder 'in'?
Peter Wood

Antworten:

179

has_keywurde in Python 3 entfernt. Aus der Dokumentation :

  • Entfernt dict.has_key()- verwenden Sie instattdessen den Operator.

Hier ist ein Beispiel:

if start not in graph:
    return None
johnnyRose
quelle
1
Ich denke, es key not in d.keys()ist wahrscheinlich auch viel langsamer, da es key not in dsich um eine O (1) -Suche handeln sollte, und ich glaube, dass keyseine Liste erstellt wird, bei der es sich um eine O (n) -Suche handelt (ganz zu schweigen davon, dass zusätzlicher Speicherplatz benötigt wird). Ich könnte mich jedoch irren - es könnte immer noch eine Hash-Suche sein
Adam Smith
3
@AdamSmith nicht in Python 3, d.keys()ist eine Ansicht, die den größten Teil der festgelegten Schnittstelle implementiert.
Antti Haapala
3
Es wurde entfernt ... aber warum? Da es Python 2 Port zu Python 3 macht mehr Arbeit zu tun.
Obst
1
@ 林果 皞: Der springende Punkt einer neuen Hauptversion ist, dass die Entwickler Verbesserungen einführen können, die Änderungen beinhalten können, anstatt alte Funktionen unterstützen zu müssen, wenn die Sprache reift. Dies ist immer ein Risiko, das vor dem Upgrade auf eine neue Hauptversion berücksichtigt werden muss. In diesem Fall inist kürzer und pythonischer und stimmt mit anderen Sammlungen in der Sprache überein.
Johnny Rose
23

has_key ist in Python 3.0 veraltet . Alternativ können Sie 'in' verwenden.

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

print('A' in graph)
>> True

print('E' in graph)
>> False
Abhishek Pansotra
quelle
17

In Python3 has_key(key)wird durch ersetzt__contains__(key)

In Python3.7 getestet:

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

Ich denke, es wird als "pythonischer" angesehen, inwenn nur festgestellt wird, ob bereits ein Schlüssel vorhanden ist, wie in

if start not in graph:
    return None
Kevin S.
quelle
Ich bin mir laut The Zen of Python (PEP 20) nicht sicher: "Explizit ist besser als implizit". Ich denke, wenn Sie das inSchlüsselwort verwenden, ist Ihre Absicht möglicherweise nicht klar genug, was if start not in graph:bedeutet das? Möglicherweise handelt es sich graphum eine Liste, die prüft, ob die Liste keine solche Zeichenfolge enthält. Auf der anderen Seite, wenn Sie Syntax wie has_key(jetzt veraltet) verwenden oder zumindest in graph.keys()ist es klarer, dass grapheindict
Amitay Drummer
4

Der gesamte Code im Dokument lautet:

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

Speichern Sie das Dokument nach dem Schreiben und drücken Sie F 5

Danach lautet der Code, den Sie in der Python IDLE-Shell ausführen:

find_path (Grafik, 'A', 'D')

Die Antwort, die Sie in IDLE erhalten sollten, lautet

['A', 'B', 'C', 'D'] 
Oana Roxana
quelle
Können Sie es bitte erklären, insbesondere den Rekursionsteil.
Verschlüsselung
0

Versuchen:

if start not in graph:

Weitere Informationen finden Sie unter ProgrammerSought

Mo-Gang
quelle