2015-11-16 3 views
36

при обходе графа в Python, я получаю эту ошибку:«ДИКТ» объект не имеет атрибута «has_key»

'dict' object has no attribute '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

Почему я получаю эту ошибку и как ее исправить?

+0

'if not start in graph:' –

+1

Возможный дубликат ['has \ _key()' или 'in'?] (Http://stackoverflow.com/questions/1323410/has-key-or-in) –

ответ

78

has_key был удален в Python 3. Из documentation:

  • Removed dict.has_key() – use the in operator instead.

Вот пример:

if start not in graph: 
    return None 
+0

I думаю, 'ключ не в d.keys()', вероятно, слишком много медленнее, так как 'key not in d' должен быть O (1), и я считаю, что' keys' создает список, который является O (n) lookup (не говоря уже о том, что требуется дополнительное пространство в памяти). Я мог ошибаться в этом, хотя, возможно, это может быть хешированный поиск –

+2

@AdamSmith не в Python 3, 'd.keys()' - это представление, которое реализует большую часть установленного интерфейса. –

4

Я думаю, что это считается "более вещий" просто использовать in при определении, если уже существует, как в случае

if start not in graph: 
    return None 
0

Весь код в документе будет:

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

После этого, код будет работать в IDLE оболочки Python будет:

find_path (граф, 'A', 'D')

ответ вы получите в IDLE является

['A', 'B', 'C', 'D'] 
Смежные вопросы