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?

Ashi
sumber
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
johnnyRose
sumber
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
Abhishek Pansotra
sumber
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'))
qloveshmily.dll
sumber
5

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

if start not in graph:
    return None
Kevin S
sumber
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'] 
Oana Roxana
sumber
Bisakah Anda menjelaskannya? Secara khusus bagian rekursi.
Enkripsi
1

Mencoba:

if start not in graph:

Untuk info lebih lanjut, lihat ProgrammerSought

Mo-Gang
sumber