ในบทเรียนไพธอนเบื้องต้นได้อธิบายถึงเรื่อง dict (ดิกชันนารี) เอาไว้
https://phyblas.hinaboshi.com/tsuchinoko14 ไพธอนก่อนถึงเวอร์ชัน 3.6 นั้นข้อมูลประเภท dict จะไม่มีการเรียงลำดับคีย์ ไม่สนลำดับก่อนหลังในการใส่ข้อมูลเข้าไป คล้ายกับ set (เซ็ต)
ดังนั้นจึงมีออบเจ็กต์ดิกชันนารีอีกชนิดที่ถูกเตรียมไว้สำหรับคนที่ต้องการให้ดิกชันนารีสามารถเรียงลำดับข้อมูลตามที่ใส่เข้าไปได้ นั่นคือ OrderedDict
เพียงแต่ว่าในไพธอนเวอร์ชัน 3.6 เป็นต้นมา dict ถูกปรับให้มีการเรียงลำดับข้อมูลแล้ว นั่นทำให้ความจำเป็นของ OrderedDict เริ่มจะหมดลงไป
อย่างไรก็ตาม OrderedDict ก็ยังไม่ได้ถูกยกเลิกการใช้ และก็ไม่ใช่ว่า dict ธรรมดาจะกลายเป็นเหมือนกับ OrderedDict เสียทีเดียว
ในนี้เรามาดูกันว่า OrderedDict ต่างจาก dict ธรรมดายังไง
วิธีใช้งาน OrderedDict อยู่ในมอดูล collections ซึ่งเป็นมอดูลมาตรฐานของไพธอน การจะใช้จำเป็นต้อง import เข้ามาก่อน
จะเปลี่ยนป็นดิกธรรมดาหรือเปลี่ยนกลับก็ได้
เมธอด keys values items ก็ได้ผลเหมือนกับ dict ธรรมดา แต่ชนิดข้อมูลที่ได้จะเป็น odict_keys, odict_values, odict_items
เพียงแต่คุณสมบัติโดยทั่วไปก็เหมือน dict_keys, dict_values, dict_items ของ dict ธรรมดา
การเปรียบเทียบค่าในดิกชันนารี ปกติเวลาเอา dict สองอันมาเปรียบเทียบกันด้วยเครื่องหมาย == ว่าเท่ากันหรือเปล่า ขอแค่สมาชิกที่คีย์เดียวกันมีค่าเท่ากันตรงกันหมดก็ถือว่าเท่ากันแล้ว
แม้ว่าตั้งแต่เวอร์ชัน 3.6 dict จะถูกปรับให้ข้อมูลมีการเรียงลำดับ แต่คุณสมบัติข้อนี้ก็ยังคงไม่เปลี่ยนแปลง เพราะแรกเริ่มเดิมทีดิกเป็นสิ่งที่ไม่ได้ให้ความสำคัญกับลำดับอยู่แล้ว
แต่สำหรับ OrderedDict นั้นลำดับมีความสำคัญ นั่นหมายความว่าเมื่อนำ OrderedDict สองอันมาเปรียบเทียบกันด้วยเครื่องหมาย == ว่าเท่ากันหรือเปล่า ผลที่ได้จะเท่ากันก็ต่อเมื่อเหมือนกันทั้งลำดับด้วย
เมธอด move_to_end เมธอดที่มีใน OrderedDict แต่ไม่มีใน dict คือ move_to_end เป็นเมธอดที่เอาไว้ย้ายสมาชิกที่มีคีย์ตามที่ระบุเอาไว้อยู่ท้ายสุดหรือหน้าสุด โดยที่ไม่เปลี่ยนลำดับของสมาชิกตัวอื่น
ถ้าใส่ False (หรือ 0) ก็จะเป็นการย้ายไปไว้หน้าสุด
เมธอด popitem popitem เป็นเมธอดที่เอาไว้ใช้เอาสมาชิกตัวสุดท้ายออกจากดิกชันนารี พร้อมทั้งคืนค่าที่โดนเอาออกมา
อย่างไรก็ตาม เมธอดนี้เมื่อใช้กับ OrderedDict จะสามารถเลือกเอาสมาชิกตัวแรกออกได้ โดยใส่ค่า False (หรือ 0)
การใช้กับฟังก์ชัน reversed reversed เป็นฟังก์ชันที่ปกติใช้กับลิสต์ ทำให้สมาชิกภายในลิสต์กลับลำดับจากท้ายมาหน้าเวลาที่มีการวนซ้ำ
รายละเอียดเพิ่มเติมอ่านได้ใน
https://phyblas.hinaboshi.com/tsuchinoko12 แต่ว่านอกจากลิสต์แล้วออบเจ็กต์ที่บรรจุข้อมูลเป็นกลุ่ม ชนิดอื่นๆที่มีนิยามเมธอด __reversed__ เอาไว้ก็สามารถใช้ฟังก์ชัน reversed ได้เช่นกัน
กลไกการทำงานจริงๆคือ reversed คือมันจะไปเรียกเมธอด __reversed__ ซึ่งถูกนิยามเอาไว้ภายในคลาสที่สามารถใช้ได้
ดังนั้นพวกออบเจ็กต์ที่ไม่มีลำดับของข้อมูลโดยทั่วไปจะไม่มีการนิยาม เมธอด __reversed__ เอาไว้ เมื่อใช้ฟังก์ชัน reversed ก็จะเกิดข้อผิดพลาด
เช่นเซ็ต
เดิมทีดิกชันนารีเองก็ไม่มีเมธอด __reversed__ ดังนั้นก็จะใช้ reversed ไม่ได้เช่นกัน ในขณะที่ OrderedDict มี __reversed__
แต่ว่าตั้งแต่เวอร์ชัน 3.8 เป็นต้นไป dict ธรรมดาก็สามารถ reversed ได้ ความแตกต่างตรงนี้จึงหายไปแล้ว
ตัวอย่างการใช้ reversed กับ OrderedDict
อ้างอิง
