OrderedDict เป็น Subclass ของ dict ความแตกต่างคือ OrderedDict จดจำลำดับการแทรก Key (Insertion Order) ในขณะที่ dict ธรรมดา (Python < 3.7) ไม่รับประกันลำดับ
อยู่ในโมดูล collections -> import collections
1. เปรียบเทียบ Dict vs OrderedDict
import collections
# Normal dict
my_dict = {}
my_dict['AA'] = 11
my_dict['BB'] = 22
my_dict['CC'] = 33
my_dict['DD'] = 44
for item in my_dict.items():
print(item)
print()
# OrderedDict
my_ord_dict = collections.OrderedDict()
my_ord_dict['AA'] = 11
my_ord_dict['BB'] = 22
my_ord_dict['CC'] = 33
my_ord_dict['DD'] = 44
for item in my_ord_dict.items():
print(item)
ผลลัพธ์ (Python < 3.7)
('AA', 11) ('CC', 33) ('BB', 22) ('DD', 44) # dict - ลำดับสุ่ม
('AA', 11) ('BB', 22) ('CC', 33) ('DD', 44) # OrderedDict - ตามลำดับที่ใส่
> **หมายเหตุ:** Python 3.7+ dict ธรรมดาก็จดจำลำดับแล้ว แต่ OrderedDict ยังมีคุณสมบัติพิเศษ เช่น move_to_end(), equality test ที่พิจารณาลำดับ
2. เปลี่ยนค่า Key -> ลำดับไม่เปลี่ยนใน OrderedDict
# เปลี่ยนค่า BB เป็น 100 my_dict['BB'] = 100 my_ord_dict['BB'] = 100
ผลลัพธ์
Dict หลังเปลี่ยน: ('AA',11) ('CC',33) ('DD',44) ('BB',100) # ลำดับเปลี่ยนไป
OrderedDict หลังเปลี่ยน: ('AA',11) ('BB',100) ('CC',33) ('DD',44) # ลำดับคงเดิม
3. ลบและแทรกใหม่ (Delete & Re-insert)
ใน OrderedDict: ลบ Key แล้วใส่ใหม่ -> จะไปอยู่ท้าย (ถือว่า Entry ใหม่)
my_ord_dict.pop('BB')
my_ord_dict['BB'] = 22 # ไปอยู่ท้ายสุด
ผลลัพธ์
หลังลบ: ('AA',11) ('CC',33) ('DD',44)
หลังแทรกใหม่: ('AA',11) ('CC',33) ('DD',44) ('BB',22)
เมธอดพิเศษของ OrderedDict
move_to_end(key, last=True)- ย้าย key ไปท้าย (last=True) หรือหน้า (last=False)popitem(last=True)- ลบและคืนค่า item ท้าย (หรือหน้า)- Equality test:
od1 == od2ตรวจสอบทั้งค่าและลำดับ