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

Python TypeError:ประเภทที่ไม่สามารถแฮชได้:'dict' Solution

ภาษาไพทอนมีความเฉพาะเจาะจงเกี่ยวกับสิ่งที่สามารถใช้เป็นคีย์ในพจนานุกรมได้ ในพจนานุกรม 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 อย่างนักพัฒนามืออาชีพแล้ว!