Objek 'dict' tidak memiliki atribut 'has_key'


105

Saat melintasi grafik dengan Python, a Saya menerima kesalahan ini:

Objek 'dict' tidak memiliki atribut 'has_key'

Ini kode saya:

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

Kode tersebut bertujuan untuk menemukan jalur dari satu node ke node lainnya. Sumber kode: http://cs.mwsu.edu/~terry/courses/4883/lectures/graphs.html

Mengapa saya mendapatkan kesalahan ini dan bagaimana cara memperbaikinya?


2
if not start in graph:
Peter Wood

1
Kemungkinan duplikat dari 'has_key ()' atau 'in'?
Peter Wood

Jawaban:


180

has_keytelah dihapus dengan Python 3. Dari dokumentasi :

  • Dihapus dict.has_key()- gunakan inoperator sebagai gantinya.

Berikut contohnya:

if start not in graph:
    return None

1
Saya pikir key not in d.keys()mungkin jauh lebih lambat juga, karena key not in dseharusnya O (1) lookup dan saya percaya keysmenghasilkan daftar, yaitu O (n) lookup (belum lagi mengambil ruang ekstra dalam memori). Saya bisa saja salah tentang hal itu - mungkin masih pencarian dengan hash
Adam Smith

3
@AdamSmith bukan dalam Python 3, d.keys()adalah tampilan yang mengimplementasikan sebagian besar antarmuka yang ditetapkan.
Antti Haapala

3
Itu dihapus ... tapi kenapa? Karena itu membuat port python 2 ke python 3 lebih banyak pekerjaan yang harus dilakukan.
Buah

1
@ 林果 皞: Inti dari versi mayor yang baru adalah bahwa para pengembang dapat memperkenalkan perbaikan yang mungkin termasuk perubahan yang melanggar daripada harus mendukung fitur-fitur lama saat bahasanya matang. Ini selalu merupakan risiko yang harus dipertimbangkan sebelum meningkatkan ke versi mayor yang baru. Dalam hal ini, inlebih pendek dan lebih Pythonic, serta konsisten dengan koleksi lain dalam bahasa tersebut.
johnnyRose

23

has_key sudah tidak digunakan lagi di Python 3.0 . Atau Anda dapat menggunakan 'dalam'

graph={'A':['B','C'],
   'B':['C','D']}

print('A' in graph)
>> True

print('E' in graph)
>> False

17

Di python3, has_key(key)diganti dengan__contains__(key)

Diuji dengan python3.7:

a = {'a':1, 'b':2, 'c':3}
print(a.__contains__('a'))

5

Saya pikir itu dianggap "lebih pythonic" hanya digunakan insaat menentukan apakah kunci sudah ada, seperti di

if start not in graph:
    return None

Saya tidak yakin, menurut The Zen of Python (PEP 20): "Eksplisit lebih baik daripada implisit". Saya pikir jika Anda menggunakan inkata kunci, niat Anda mungkin tidak cukup jelas apa if start not in graph:artinya? mungkin graphadalah daftar dan memeriksa apakah tidak ada string seperti itu dalam daftar? Di sisi lain, jika Anda menggunakan sintaks seperti has_key(sekarang usang) atau setidaknya in graph.keys()lebih jelas bahwa graphadalahdict
Amitay Drummer

4

Seluruh kode dalam dokumen tersebut adalah:

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

Setelah menulisnya, simpan dokumen tersebut dan tekan F 5

Setelah itu, kode yang akan Anda jalankan di shell Python IDLE adalah:

find_path (grafik, 'A', 'D')

Jawaban yang harus Anda terima di IDLE adalah

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

Bisakah Anda menjelaskannya? Secara khusus bagian rekursi.
Enkripsi

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.