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

OrderedDict ใน Python: Dictionary ที่จดจำลำดับ Key

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 ตรวจสอบทั้งค่าและลำดับ