พจนานุกรม Python ยอมรับเฉพาะประเภทข้อมูลที่แฮชได้เป็นคีย์ในพจนานุกรม รายการไม่ใช่ประเภทข้อมูลที่แฮชได้ หากคุณระบุรายการเป็นคีย์ในพจนานุกรม คุณจะพบข้อผิดพลาด "TypeError:unhashable type:'list'"
ในคู่มือนี้ เราจะพูดถึงความหมายของข้อผิดพลาดนี้และเหตุผลที่คุณเห็นข้อผิดพลาดนี้ในโค้ดของคุณ เราจะอธิบายตัวอย่างข้อผิดพลาดนี้เพื่อแสดงวิธีแก้ปัญหา
TypeError:ประเภทที่ไม่สามารถแฮชได้:'รายการ'
พจนานุกรมมีสองส่วน:คีย์และค่า คีย์คือป้ายกำกับที่เกี่ยวข้องกับค่าใดค่าหนึ่ง ในการเข้าถึงค่า คุณต้องอ้างอิงชื่อคีย์ของค่านั้น
แม้ว่าค่าจะเป็นประเภทข้อมูลใดก็ได้ จากรายการไปจนถึงสตริง จะยอมรับเฉพาะออบเจกต์ที่แฮชได้เท่านั้นที่เป็นคีย์ ออบเจ็กต์ที่แฮชได้คือออบเจ็กต์ที่มีค่าแฮชที่ไม่เปลี่ยนแปลงเมื่อเวลาผ่านไป ตัวอย่างของอ็อบเจกต์ที่แฮชได้คือทูเพิลและสตริง
รายการไม่มีค่าแฮชที่ไม่เปลี่ยนแปลง ค่าแฮชสามารถเปลี่ยนแปลงได้เมื่อเวลาผ่านไป ซึ่งหมายความว่าคุณไม่สามารถระบุรายการเป็นคีย์พจนานุกรมได้
ตัวอย่างสถานการณ์
มาสร้างโปรแกรมที่สร้างรายชื่อนักเรียนที่มีเกรดเฉลี่ยมากกว่า 75 กัน รายการนี้จะมีบันทึกพจนานุกรมของนักเรียนแต่ละคนและเกรดของพวกเขา ในการสร้างพจนานุกรมนี้ เราจะใช้พจนานุกรมที่มีรายชื่อนักเรียนทั้งหมดในโรงเรียนและผลการเรียน
เริ่มต้นด้วยการกำหนดรายชื่อนักเรียนและพจนานุกรมสำหรับนักเรียนชั้นยอดของเรา:
students = [ { "name": "Linda", "grades": [84, 82, 65] }, { "name": "Alex", "grades": [67, 68, 83] }, { "name": "Holly", "grades": [72, 74, 81] } ] top_students = {}
แต่ละค่าในรายการ "นักเรียน" เป็นพจนานุกรม พจนานุกรมแต่ละชุดประกอบด้วยปุ่มสองปุ่ม ได้แก่ ชื่อและเกรด เราได้กำหนดพจนานุกรมที่เรียกว่า “top_students” ซึ่งจะมีข้อมูลเกี่ยวกับนักเรียนชั้นนำของเรา
81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้
ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก
ตอนนี้เราได้กำหนดพจนานุกรมนี้แล้ว เราใช้ for loop เพื่อกรองนักเรียนที่มีเกรดเฉลี่ยมากกว่า 75 และเพิ่มลงในพจนานุกรมใหม่ของเรา:
for s in students: average = sum(s["grades"]) / len(s["grades"]) if average > 75: top_students[s["grades"]] =s["name"]
ในการวนซ้ำแต่ละครั้ง เราจะคำนวณค่าเฉลี่ยของเกรดทั้งหมดที่นักเรียนได้รับ เราทำได้โดยการหารผลรวมของเกรดทั้งหมดด้วยจำนวนคะแนนที่บันทึกไว้
ต่อไป เราจะตรวจสอบว่าค่าเฉลี่ยนั้นมากกว่า 75 หรือไม่ หากใช่ เราจะสร้างรายการใหม่ในพจนานุกรม top_students ด้วยชื่อของนักเรียนและเกรดของพวกเขา
สุดท้าย เราพิมพ์พจนานุกรม top_students ไปที่คอนโซล ดังนั้นเราจึงเห็นนักเรียนทั้งหมดที่มีเกรดเฉลี่ยมากกว่า 75:
print(top_students)
เรียกใช้รหัสของเราและดูว่าเกิดอะไรขึ้น:
Traceback (most recent call last): File "main.py", line 11, in <module> top_students[s["grades"]] = s["name"] TypeError: unhashable type: 'list'
รหัสของเราดำเนินการไม่สำเร็จ
การแก้ปัญหา
รหัสของเราใช้งานได้จนกว่าล่ามจะไปถึงบรรทัดที่ 11 ในบรรทัดนี้ รหัสของเราระบุว่า:
top_students[s["grades"]] = s["name"]
ข้อผิดพลาดในรหัสของเราเป็นเพราะเราได้พยายามกำหนดรายการเป็นคีย์ในพจนานุกรม เมื่อโค้ดของเราแยกวิเคราะห์บรรทัดนี้ในการวนซ้ำครั้งแรกของลูป โค้ดของเราจะพยายามสร้างพจนานุกรมด้วยคีย์และค่าต่อไปนี้:
{ [84, 82, 65]: "Linda" }
นี่เป็นพจนานุกรมที่ไม่ถูกต้อง รหัสของเราพยายามกำหนดรายการเป็นคีย์ซึ่งใช้งานไม่ได้
เพื่อแก้ปัญหานี้ เราใช้ชื่อของนักเรียนเป็นคีย์ในพจนานุกรมแทนรายการเกรด:
top_students[s["name"]] = s["grades"]
เราได้กำหนดรายการเกรดเป็นค่าแทนที่จะเป็นคีย์ ชื่อของนักเรียนคือกุญแจสำคัญในพจนานุกรม เรียกใช้รหัสของเรา:
{'Linda': [84, 82, 65], 'Holly': [72, 74, 81]}
รหัสของเราประสบความสำเร็จในการสร้างพจนานุกรมที่มีข้อมูลเกี่ยวกับนักเรียนที่มีผลการเรียนดีเด่น นักเรียนคนใดก็ตามที่มีเกรดเฉลี่ยในการทดสอบสามครั้งล่าสุดมากกว่า 75 จะถูกเพิ่มลงในพจนานุกรม
พจนานุกรมของเราแบ่งออกเป็นดังนี้:
- คีย์:ลินดา, ฮอลลี่
- ค่า:[84, 82, 65], [72, 74, 81]
เนื่องจากตอนนี้เรากำลังกำหนดสตริงให้กับชื่อคีย์ของเรา รหัสของเราจึงใช้งานได้
บทสรุป
ข้อผิดพลาด "TypeError:unhashable type:'list'" ปรากฏขึ้นเมื่อคุณพยายามกำหนดรายการเป็นคีย์ในพจนานุกรม ในการแก้ไขข้อผิดพลาดนี้ ตรวจสอบให้แน่ใจว่าคุณกำหนดเฉพาะวัตถุที่แฮชได้ เช่น สตริงหรือทูเพิล เป็นคีย์สำหรับพจนานุกรม
ตอนนี้คุณพร้อมที่จะแก้ไขข้อผิดพลาดนี้อย่างนักเขียนโค้ดมืออาชีพแล้ว!