2015-11-16 14 views
36

Przemierzając wykres w Pythonie, A ja dostaję ten błąd:'dict' obiekt ma atrybut 'has_key'

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

Celami kod znaleźć ścieżki z jednego węzła do innych. Źródło kodu: http://cs.mwsu.edu/~terry/courses/4883/lectures/graphs.html

Dlaczego pojawia się ten błąd i jak mogę to naprawić?

+0

'jeśli nie zacznij od wykresu:' –

+1

Możliwy duplikat ['has \ _key()' lub 'in'?] (Http://stackoverflow.com/questions/1323410/has-key-lub-in) –

Odpowiedz

78

has_key został usunięty w Pythonie 3. Z documentation:

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

Oto przykład:

if start not in graph: 
    return None 
+0

I Myślę, że 'klucz nie w d.keys()' jest prawdopodobnie * znacznie * wolniejszy, ponieważ 'klucz nie w d' powinien być szukaniem O (1) i wierzę, że' klucze' tworzą listę, która jest O (n) lookup (nie wspominając o zabraniu dodatkowej pamięci). Mógłbym się jednak mylić - to wciąż może być mieszane wyszukiwanie –

+2

@AdamSmith nie w Pythonie 3, 'd.keys()' jest widokiem, który implementuje większość ustawionego interfejsu. –

4

myślę, że uważa się za "bardziej pythonic" po prostu użyć in przy ustalaniu, czy Klucz już istnieje, tak jak w przypadku:

if start not in graph: 
    return None 
0

Cały kod w dokumencie będą:

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 

Po napisaniu go, zapisz dokument i nacisnąć F 5

potem kod będzie działać w Pythona IDLE powłoce będą:

find_path (wykres, 'A', 'D')

odpowiedź powinna pojawić się w bezczynności

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