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

Python TypeError:ประเภทที่ไม่สามารถแฮชได้:'รายการ' โซลูชัน

พจนานุกรม 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'" ปรากฏขึ้นเมื่อคุณพยายามกำหนดรายการเป็นคีย์ในพจนานุกรม ในการแก้ไขข้อผิดพลาดนี้ ตรวจสอบให้แน่ใจว่าคุณกำหนดเฉพาะวัตถุที่แฮชได้ เช่น สตริงหรือทูเพิล เป็นคีย์สำหรับพจนานุกรม

ตอนนี้คุณพร้อมที่จะแก้ไขข้อผิดพลาดนี้อย่างนักเขียนโค้ดมืออาชีพแล้ว!