Podczas przeglądania wykresu w Pythonie otrzymuję następujący błąd:
Obiekt „dict” nie ma atrybutu „has_key”
Oto mój kod:
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
Kod ma na celu znalezienie ścieżek z jednego węzła do drugiego. Źródło kodu: http://cs.mwsu.edu/~terry/courses/4883/lectures/graphs.html
Dlaczego otrzymuję ten błąd i jak mogę go naprawić?
python
python-3.x
dictionary
Ashi
źródło
źródło
if not start in graph:
Odpowiedzi:
has_key
został usunięty w Pythonie 3. Z dokumentacji :Oto przykład:
źródło
key not in d.keys()
jest to prawdopodobnie znacznie wolniejsze, ponieważkey not in d
powinno być wyszukiwaniem O (1) i uważam, żekeys
tworzy listę, która jest wyszukiwaniem O (n) (nie wspominając o zajęciu dodatkowego miejsca w pamięci). Mogę się jednak co do tego mylić - nadal może to być hashowane wyszukiwanied.keys()
to widok, który implementuje większość ustawionego interfejsu.in
jest krótszy i bardziej Pythonic, a także jest spójny z innymi zbiorami w tym języku.has_key stał się przestarzały w Pythonie 3.0 . Alternatywnie możesz użyć „w”
źródło
W python3
has_key(key)
jest zastępowany przez__contains__(key)
Testowane w pythonie 3.7:
źródło
Myślę, że jest uważane za „bardziej pythonowe”,
in
gdy używa się go tylko przy określaniu, czy klucz już istnieje, jak wźródło
in
słowa kluczowego, twój zamiar może nie być wystarczająco jasny, co toif start not in graph:
znaczy? może byćgraph
listą i sprawdza, czy nie ma takiego ciągu na liście? Z drugiej strony, jeśli używasz składni takiej jakhas_key
(obecnie przestarzała) lub przynajmniejin graph.keys()
jest to bardziej jasne, żegraph
jest todict
Cały kod w dokumencie będzie wyglądał następująco:
Po napisaniu zapisz dokument i naciśnij F 5
Następnie kod, który uruchomisz w powłoce Python IDLE będzie wyglądał następująco:
find_path (wykres, „A”, „D”)
Odpowiedź, którą powinieneś otrzymać w IDLE, brzmi
źródło
Próbować:
Aby uzyskać więcej informacji, zobacz ProgrammerSought
źródło