2015-11-16 39 views
36

Mentre attraversa un grafico in Python, uno sto ricevendo questo errore:oggetto 'dict' non ha alcun attributo 'has_key'

'dict' object has no attribute 'has_key'

Ecco il mio codice:

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 

Gli obiettivi di codice per trovare i percorsi da un nodo ad altri. Codice sorgente: http://cs.mwsu.edu/~terry/courses/4883/lectures/graphs.html

Perché sto ricevendo questo errore e come posso risolvere il problema?

+0

'se non iniziare nel grafico:' –

+1

Possibile duplicato di ['ha \ _key()' o 'in'?] (Http://stackoverflow.com/questions/1323410/has-key-or-in) –

risposta

78

has_key è stato rimosso in Python 3. Dal documentation:

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

Ecco un esempio:

if start not in graph: 
    return None 
+0

I pensate che 'key not in d.keys()' sia probabilmente * molto * più lento, dato che 'key not in d' dovrebbe essere O (1) lookup e credo che' keys' produca una lista, che è O (n) ricerca (per non parlare di spazio extra in memoria). Potrei sbagliarmi comunque - potrebbe ancora essere la ricerca con hash –

+2

@AdamSmith non in Python 3, 'd.keys()' è una vista che implementa la maggior parte dell'interfaccia impostata. –

4

penso che è considerato "più divinatorio" utilizzare solo in nel determinare se un la chiave esiste già, come in

if start not in graph: 
    return None 
0

L'intero codice nel documento sarà:

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 

dopo averlo scritto, salvare il documento e premere F 5

Dopo di che, il codice verrà eseguito nella shell IDLE Python sarà:

find_path (grafico, 'a', 'D')

La risposta si dovrebbe ricevere in IDLE è

['A', 'B', 'C', 'D'] 
Problemi correlati