Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

แก้ไข Python TypeError: unhashable type: 'dict'

ภาษา Python เฉพาะเจาะจงเกี่ยวกับสิ่งที่สามารถใช้เป็นกุญแจ (key) ในดิกชันนารี (dictionary) ใน Python dictionary ทุกกุญแจต้องเป็น hashable (แฮชได้)

หากคุณพยายามใช้ชนิดกุญแจที่ unhashable (แฮชไม่ได้) เมื่อเพิ่มกุญแจในดิกชันนารี คุณจะเจอข้อผิดพลาด "TypeError: unhashable type: 'dict'"

ในคู่มือนี้ เราพูดถึงว่าข้อผิดพลาดนี้หมายถึงอะไรและทำไมมันจึงถูกยกขึ้น เราจะเดินทางผ่านตัวอย่างของข้อผิดพลาดนี้ เพื่อคุณสามารถเรียนรู้วิธีแก้ไขในโค้ดของคุณ

TypeError: unhashable type: 'dict'

ดิกชันนารีประกอบด้วยสองส่วน: กุญแจ (keys) และค่า (values) กุญแจคือตัวระบุตัวตนที่ผูกกับค่า เมื่อคุณอ้างอิงกุญแจ คุณจะสามารถดึงค่าที่เกี่ยวข้องกับกุญแจนั้นได้

เฉพาะออบเจ็กต์ที่ hashable เท่านั้นที่สามารถเป็นกุญแจในดิกชันนารีได้ ออบเจ็กต์ที่ไม่เปลี่ยนแปลง (immutable) เช่น สตริง จำนวนเต็ม ทูเพิล และ frozensets เป็น hashable พร้อมข้อยกเว้นบางอย่าง ดิกชันนารี ดังนั้น ไม่สามารถใช้เป็นกุญแจในดิกชันนารีได้

เพื่อเพิ่มรายการในดิกชันนารี คุณต้องระบุกุญแจ hashable ที่ถูกต้อง ตัวอย่างเช่น "name" เป็นกุญแจที่ถูกต้อง แต่ { "name": "test" } ไม่ใช่

สถานการณ์ตัวอย่าง

ที่นี่ เราเขียนโปรแกรมที่เพิ่มเค้กทั้งหมดที่ขายได้มากกว่าห้าครั้งที่ร้านเบเกอรี่ จากดิกชันนารีหนึ่งไปยังอีกดิกชันนารีหนึ่ง

เริ่มต้นด้วยการประกาศรายการเค้กที่มีดิกชันนารีเกี่ยวกับแต่ละเค้ก เรายังกำหนดดิกชันนารีที่เราสามารถจัดเก็บเค้กที่ขายได้มากกว่าห้าครั้ง

cakes = [ { "name": "Black Forest Gateau", "sold": 3 }, { "name": "Carrot Cake", "sold": 7 }, { "name": "Coconut and Lime Cake", "sold": 9 } ] sold_more_than_five = {}

รายการ "cakes" ของเราประกอบด้วยสามดิกชันนารี แต่ละดิกชันนารีประกอบด้วยสองกุญแจและค่า ชื่อกุญแจคือ "cake" และ "sold"

ตอนนี้ เราเขียนลูป for ที่ผ่านรายการเค้กของเราและหาเค้กที่ขายได้มากกว่าห้าครั้ง เค้กเหล่านั้นจะถูกเพิ่มเข้าไปในดิกชันนารี "sold_more_than_five":

for c in cakes: if c["sold"] > 5: sold_more_than_five[c] = c["sold"] print(c["name"] + " has been sold more than five times.") print(sold_more_than_five)

ในลูป for ของเรา เราเปรียบเทียบว่าค่าของ "sold" ในแต่ละดิกชันนารีมากกว่า 5 หรือไม่ หากใช่ รายการนั้นจะถูกเพิ่มเข้าไปในดิกชันนารี "sold_more_than_five" ของเรา จากนั้น ข้อความจะถูกพิมพ์ไปยังคอนโซลแจ้งผู้ใช้ว่าเค้กเฉพาะตัวนั้นขายได้มากกว่าห้าครั้ง

เมื่อลูปของเรารันเสร็จ เราพิมพ์ดิกชันนารี "sold_more_than_five" ไปยังคอนโซล

รันโค้ดของเราเพื่อให้แน่ใจว่าโปรแกรมของเราทำงาน:

Traceback (most recent call last): File "main.py", line 16, in <module> sold_more_than_five[c] = c["sold"] TypeError: unhashable type: 'dict'

โค้ดของเราคืนค่าข้อผิดพลาด

วิธีแก้ไข

โค้ดของเราไม่ทำงานเพราะเราพยายามสร้างกุญแจดิกชันนารีโดยใช้อีกดิกชันนารีหนึ่ง

ค่าของ "c" เท่ากับดิกชันนารีจากรายการ "cakes" ของเรา นี่หมายความว่าเมื่อเราพยายามเพิ่มรายการในดิกชันนารี "sold_more_than_five" เรากำลังพยายามเพิ่มดิกชันนารีเป็นกุญแจโดยไม่ได้ตั้งใจ:

sold_more_than_five[c] = c["sold"]

เมื่อคำสั่ง "if" ของเรารันบนเค้ก "Carrot Cake" โค้ดของเราพยายามรัน:

sold_more_than_five[{"name": "Carrot Cake", "sold": 7}] = 7

นี่ไม่ถูกต้องเพราะเรากำลังพยายามเพิ่มดิกชันนารีเป็นกุญแจในดิกชันนารี เราสามารถแก้ปัญหานี้โดยใช้ c["name"] เป็นชื่อกุญแจดิกชันนารีของเรา:

sold_more_than_five[c["name"]] = c["sold"]

รันโค้ดของเราด้วยโค้ดที่แก้ไขแล้ว:

Carrot Cake has been sold more than five times. Coconut and Lime Cake has been sold more than five times. {'Carrot Cake': 7, 'Coconut and Lime Cake': 9}

โค้ดของเรารันสำเร็จ เราตอนนี้ใช้ชื่อของแต่ละเค้คเป็นกุญแจแทนที่จะเป็นดิกชันนารี

สรุป

ข้อผิดพลาด "TypeError: unhashable type: 'dict'" ถูกยกขึ้นเมื่อคุณพยายามสร้างรายการในดิกชันนารีที่กุญแจของมันเป็นออบเจ็กต์ unhashable เฉพาะออบเจ็กต์ที่ไม่เปลี่ยนแปลง (immutable) เช่น สตริง ทูเพิล และจำนวนเต็ม เท่านั้นที่สามารถใช้เป็นกุญแจในดิกชันนารีได้

เพื่อแก้ไขข้อผิดพลาดนี้ ตรวจสอบให้แน่ใจว่าคุณใช้เฉพาะออบเจ็กต์ hashable เมื่อสร้างรายการในดิกชันนารี ตอนนี้คุณพร้อมที่จะแก้ไขข้อผิดพลาด Python ทั่วไปนี้อย่างนักพัฒนามืออาชีพแล้ว!