Python s√∂zlukleri, bir s√∂zlukte anahtar olarak yalnƒ±zca hashable veri turlerini kabul eder. Liste, ele geçirilebilir bir veri turu deƒüildir. Bir s√∂zlukte bir listeyi anahtar olarak belirtirseniz, "TypeError: unhashable type: ‚Äòlist‚Äôrsquo;rdquo; error.
Bu kƒ±lavuzda, bu hatanƒ±n ne anlama geldiƒüi ve kodunuzda neden g√∂rduƒüunuz hakkƒ±nda konu≈üuyoruz. Nasƒ±l ç√∂zeceƒüinizi g√∂stermek için bu hatanƒ±n bir √∂rneƒüini inceleyeceƒüiz.
TypeError: unhashable type: ‘list’
S√∂zluklerin iki b√∂lumu vardƒ±r: anahtarlar ve deƒüerler. Anahtarlar, belirli bir deƒüerle ili≈ükili etiketlerdir. Bir deƒüere eri≈ümek için, o deƒüerin anahtar adƒ±na ba≈üvurmalƒ±sƒ±nƒ±z.
Değerler, dizeleri -in-python/">listeler, anahtar olarak yalnızca hashable nesneler kabul edilebilir. Hashable nesneler, zamanla değişmeyen bir hash değerine sahip nesnelerdir. Karıştırılabilir nesnelere örnek olarak demetler ve dizeler verilebilir.
Listelerin değişmeyen bir karma değeri yoktur. Hash değerleri zamanla değişebilir. Bu, sözluk anahtarı olarak bir liste belirleyemeyeceğiniz anlamına gelir.
Örnek Senaryo
ortalama notu uzerinde olan √∂ƒürencilerin bir listesini olu≈üturan bir program olu≈üturalƒ±m. 75. Bu listede her √∂ƒürencinin s√∂zluk kayƒ±tlarƒ± ve notlarƒ± yer alacaktƒ±r. Bu s√∂zluƒüu olu≈üturmak için, okuldaki tum √∂ƒürencilerin ve notlarƒ±nƒ±n bir listesini içeren bir s√∂zlukten çalƒ±≈üacaƒüƒ±z.
√ñƒürencilerin bir listesini ve a≈üaƒüƒ±dakiler için bir s√∂zluk tanƒ±mlayarak ba≈ülayalƒ±m. en iyi √∂ƒürencilerimiz:
"√∂ƒürenciler‚" liste bir s√∂zluktur. Her s√∂zluk iki anahtar içerir: isim ve notlar. "top_students‚" adƒ±nda bir s√∂zluk tanƒ±mladƒ±k. Bu, en iyi √∂ƒürencilerimizle ilgili bilgileri içerecektir.
Katƒ±lƒ±mcƒ±larƒ±n %81’i, bir eƒüitim kampƒ±na katƒ±ldƒ±ktan sonra teknik i≈ü beklentileri konusunda daha emin hissettiklerini belirtti. Bugun bir eƒüitim kampƒ± ile e≈üle≈ütirin.
Ortalama bir eƒüitim kampƒ± mezunu, bir eƒüitim kampƒ±na ba≈ülamaktan ilk i≈üini bulmaya kadar, kariyer geçi≈üinde altƒ± aydan az zaman harcadƒ±.
Artƒ±k bunu tanƒ±mladƒ±k. s√∂zlukte, not ortalamasƒ± 75’in uzerinde olan √∂ƒürencileri filtrelemek ve onlarƒ± yeni s√∂zluƒüumuze eklemek için for d√∂ngusu kullanƒ±yoruz:
For d√∂ngusunun her yinelemesinde, bir √∂ƒürencinin aldƒ±ƒüƒ± tum notlarƒ±n ortalamasƒ±. Bunu, tum notlarƒ±n toplamƒ±nƒ± kaç tane not kaydedildiƒüine b√∂lerek yapƒ±yoruz.
Sonra, bu ortalamanƒ±n 75’ten buyuk olup olmadƒ±ƒüƒ±nƒ± kontrol ediyoruz. Eƒüer √∂yleyse, yeni bir giri≈ü olu≈üturuyoruz. top_students s√∂zluƒüu bir √∂ƒürencinin adƒ± ve notlarƒ± ile birlikte.
Son olarak, top_students s√∂zluƒüunu konsola yazdƒ±rƒ±yoruz, b√∂ylece not ortalamasƒ± 75’in uzerinde olan tum √∂ƒürencileri g√∂rebiliyoruz:
Kodumuzu çalƒ±≈ütƒ±rƒ±n ve ne olduƒüunu g√∂run olur:
Kodumuz başarıyla yurutulemiyor.
The Çözum
Kodumuz, yorumlayƒ±cƒ± 11. satƒ±ra ula≈üana kadar çalƒ±≈üƒ±r. Bu satƒ±rda kodumuz ≈üunu belirtir:
Kodumuzdaki hata, bir listeyi ≈üu ≈üekilde atamaya çalƒ±≈ümƒ±≈ü olmamƒ±zdƒ±r. s√∂zlukte bir anahtar. Kodumuz d√∂ngunun ilk yinelemesinde bu satƒ±rƒ± ayrƒ±≈ütƒ±rdƒ±ƒüƒ±nda, kodumuz a≈üaƒüƒ±daki anahtar ve deƒüere sahip bir s√∂zluk olu≈üturmaya çalƒ±≈üƒ±r:
Bu geçersiz bir s√∂zluk. Kodumuz çalƒ±≈ümayan bir anahtar olarak bir liste atamaya çalƒ±≈üƒ±r.
Bu sorunu ç√∂zmek için, s√∂zlukte not listesi yerine √∂ƒürencinin adƒ±nƒ± anahtar olarak kullanƒ±rƒ±z:
Notlar listesini anahtar yerine bir deƒüer olarak atadƒ±k. √ñƒürencinin adƒ± s√∂zlukteki anahtardƒ±r. Kodumuzu çalƒ±≈ütƒ±ralƒ±m:
Kodumuz, en iyi performans g√∂steren √∂ƒürenciler hakkƒ±nda bilgiler içeren bir s√∂zluk ba≈üarƒ±yla olu≈üturuyor. Son uç sƒ±navƒ±ndaki ortalama notu 75’in uzerinde olan herhangi bir √∂ƒürenci s√∂zluƒüe eklendi.