При просмотре графика в 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
Почему я получаю эту ошибку и как ее исправить?
if not start in graph:
Ответы:
has_key
был удален в Python 3. Из документации :Вот пример:
источник
key not in d.keys()
это, вероятно, намного медленнее, посколькуkey not in d
должен быть поиск O (1), и я считаю, чтоkeys
создает список, который является поиском O (n) (не говоря уже о дополнительном пространстве в памяти). Хотя я могу ошибаться - это все еще может быть хешированный поискd.keys()
это представление, которое реализует большую часть установленного интерфейса.in
он короче и более Pythonic, а также согласуется с другими коллекциями на языке.has_key устарел в Python 3.0 . В качестве альтернативы вы можете использовать 'in'
источник
В python3
has_key(key)
заменяется на__contains__(key)
Протестировано в python3.7:
источник
Я думаю, что "более питоническим" считается использование
in
при определении того, существует ли уже ключ, как висточник
in
ключевое слово, ваше намерение может быть недостаточно ясным, чтоif start not in graph:
означает? может бытьgraph
это список и он проверяет, нет ли такой строки в списке? С другой стороны, если вы используете синтаксис вродеhas_key
(теперь устарел) или, по крайней мере,in graph.keys()
более ясно, чтоgraph
этоdict
Весь код в документе будет:
После написания сохраните документ и нажмите F 5
После этого код, который вы запустите в оболочке Python IDLE, будет следующим:
find_path (график, 'A', 'D')
Ответ, который вы должны получить в IDLE:
источник
Пытаться:
Для получения дополнительной информации см. ProgrammerSought.
источник