ภาษาไพทอนมีความเฉพาะเจาะจงเกี่ยวกับสิ่งที่สามารถใช้เป็นคีย์ในพจนานุกรมได้ ในพจนานุกรม Python คีย์ทั้งหมดต้องแฮชได้
หากคุณพยายามใช้ประเภทคีย์ที่ไม่สามารถแฮชได้เมื่อเพิ่มคีย์ลงในพจนานุกรม คุณจะพบข้อผิดพลาด "TypeError:unhashable type:'dict'"
ในคู่มือนี้ เราจะพูดถึงความหมายของข้อผิดพลาดนี้และสาเหตุที่ทำให้เกิดข้อผิดพลาดนี้ขึ้น เราอธิบายตัวอย่างข้อผิดพลาดนี้เพื่อให้คุณได้เรียนรู้วิธีแก้ไขในโค้ดของคุณ
TypeError:ประเภทที่ไม่สามารถแฮชได้:'dict'
พจนานุกรมประกอบด้วยสองส่วน:คีย์และค่า คีย์เป็นตัวระบุที่เชื่อมโยงกับค่า เมื่อคุณอ้างอิงคีย์ คุณจะสามารถดึงค่าที่เกี่ยวข้องกับคีย์นั้นได้
เฉพาะวัตถุที่แฮชได้เท่านั้นที่สามารถเป็นคีย์ในพจนานุกรมได้ ออบเจ็กต์ที่ไม่เปลี่ยนรูป เช่น สตริง จำนวนเต็ม ทูเพิล และฟรอสเซ็ต สามารถแฮชได้ โดยมีข้อยกเว้นบางประการ พจนานุกรมจึงไม่สามารถใช้เป็นคีย์ในพจนานุกรมได้
ในการเพิ่มรายการลงในพจนานุกรม คุณต้องระบุคีย์ที่แฮชได้ที่ถูกต้อง ตัวอย่างเช่น “ชื่อ” เป็นรหัสที่ถูกต้อง แต่ { “ชื่อ”:“ทดสอบ” } ไม่ใช่.
ตัวอย่างสถานการณ์
ที่นี่ เราเขียนโปรแกรมที่เพิ่มเค้กทั้งหมดที่มียอดขายมากกว่าห้าครั้งที่ร้านเบเกอรี่จากพจนานุกรมหนึ่งไปยังอีกพจนานุกรมหนึ่ง
เริ่มต้นด้วยการประกาศรายชื่อเค้กที่มีพจนานุกรมเกี่ยวกับเค้กแต่ละชิ้น นอกจากนี้เรายังกำหนดพจนานุกรมซึ่งเราสามารถจัดเก็บเค้กที่ขายได้มากกว่าห้าครั้ง
81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้
ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก
cakes = [ { "name": "Black Forest Gateau", "sold": 3 }, { "name": "Carrot Cake", "sold": 7 }, { "name": "Coconut and Lime Cake", "sold": 9 } ] sold_more_than_five = {}
รายการ "เค้ก" ของเราประกอบด้วยพจนานุกรมสามเล่ม พจนานุกรมแต่ละชุดประกอบด้วยคีย์และค่าสองคีย์ ชื่อคีย์คือ "เค้ก" และ "ขายแล้ว"
ตอนนี้ เราเขียน for loop ที่ผ่านรายการเค้กของเรา และค้นหาเค้กที่ขายได้มากกว่าห้าครั้ง เค้กเหล่านั้นจะถูกเพิ่มลงในพจนานุกรม “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 loop เราเปรียบเทียบว่าค่าของ "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” เท่ากับพจนานุกรมจากรายการ “เค้ก” ของเรา ซึ่งหมายความว่าเมื่อเราพยายามเพิ่มรายการลงในพจนานุกรม "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'" ปรากฏขึ้นเมื่อคุณพยายามสร้างรายการในพจนานุกรมที่มีคีย์เป็นวัตถุที่ไม่สามารถแฮชได้ เฉพาะวัตถุที่ไม่เปลี่ยนรูป เช่น สตริง ทูเพิล และจำนวนเต็มเท่านั้นที่สามารถใช้เป็นคีย์ในพจนานุกรมได้
เพื่อแก้ไขข้อผิดพลาดนี้ ตรวจสอบให้แน่ใจว่าคุณใช้เฉพาะวัตถุที่แฮชได้เมื่อสร้างรายการในพจนานุกรม ตอนนี้คุณพร้อมที่จะแก้ไขข้อผิดพลาดทั่วไปของ Python อย่างนักพัฒนามืออาชีพแล้ว!