วิธีใช้ OrderedDict, Python สั่งพจนานุกรม

ธุรกิจ

พจนานุกรม Python (วัตถุประเภท dict) ไม่รักษาลำดับขององค์ประกอบ CPython ดำเนินการดังกล่าวตั้งแต่ 3.6 แต่ขึ้นอยู่กับการนำไปใช้งานและไม่มีกำหนดในการนำไปใช้งานอื่นๆ ข้อกำหนดภาษาได้รักษาลำดับไว้ตั้งแต่ 3.7

OrderedDict มีให้ในโมดูลคอลเลกชันของไลบรารีมาตรฐานเป็นพจนานุกรมที่รักษาลำดับ ใช้ตัวนี้ได้อย่างปลอดภัย

นำเข้าโมดูลคอลเลกชัน รวมอยู่ในไลบรารีมาตรฐานและไม่จำเป็นต้องติดตั้ง

import collections

หากคุณเขียนสิ่งต่อไปนี้ คุณสามารถละเว้นคอลเลกชันได้ ในตัวอย่างต่อไปนี้

from collections import OrderedDict

ต่อไปนี้เป็นคำอธิบายวิธีการใช้ OrderedDict

  • การสร้างออบเจกต์ OrderedDict
  • OrderedDict เป็นคลาสย่อยของ dict
  • ย้ายองค์ประกอบไปที่จุดเริ่มต้นหรือจุดสิ้นสุด
  • เพิ่มองค์ประกอบใหม่ในตำแหน่งใดก็ได้
  • จัดเรียงองค์ประกอบใหม่ (เรียงลำดับใหม่)
  • จัดเรียงองค์ประกอบตามคีย์หรือค่า

การสร้างออบเจกต์ OrderedDict

คอนสตรัคเตอร์ collections.OrderedDict() สามารถใช้เพื่อสร้างออบเจกต์ OrderedDict

สร้างออบเจ็กต์ OrderedDict ที่ว่างเปล่าและเพิ่มค่า

od = collections.OrderedDict()

od['k1'] = 1
od['k2'] = 2
od['k3'] = 3

print(od)
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

นอกจากนี้ยังสามารถระบุอาร์กิวเมนต์ให้กับคอนสตรัคเตอร์ได้

คุณสามารถใช้อาร์กิวเมนต์ของคีย์เวิร์ด ลำดับของคู่คีย์-ค่า (เช่น tuples (คีย์ ค่า)) และอื่นๆ รายการหลังสามารถเป็นรายการหรือทูเพิลได้ตราบใดที่เป็นคู่คีย์-ค่า

print(collections.OrderedDict(k1=1, k2=2, k3=3))
print(collections.OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)]))
print(collections.OrderedDict((['k1', 1], ['k2', 2], ['k3', 3])))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

จนถึงเวอร์ชัน 3.5 ลำดับของอาร์กิวเมนต์ของคีย์เวิร์ดจะไม่ถูกรักษาไว้ แต่เนื่องจากเวอร์ชัน 3.6 จึงมีการเก็บรักษาไว้

เปลี่ยนแปลงในเวอร์ชัน 3.6: ด้วยการยอมรับ PEP 468 ลำดับของคอนสตรัคเตอร์ OrderedDict และอาร์กิวเมนต์ของคีย์เวิร์ดที่ส่งผ่านไปยังเมธอด update() จะถูกรักษาไว้
collections — Container datatypes — Python 3.10.0 Documentation

พจนานุกรมปกติ (อ็อบเจ็กต์ประเภท dict) ยังสามารถส่งต่อไปยังคอนสตรัคเตอร์ได้ แต่ในกรณีของการใช้งานโดยที่ประเภท dict ไม่รักษาลำดับ OrderedDict ที่สร้างจากพจนานุกรมนั้นจะไม่รักษาลำดับด้วย

print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

OrderedDict เป็นคลาสย่อยของ dict

OrderedDict เป็นคลาสย่อยของ dict

print(issubclass(collections.OrderedDict, dict))
# True

OrderedDict ยังมีเมธอดเช่นเดียวกับ dict และวิธีการรับ เปลี่ยนแปลง เพิ่ม และลบองค์ประกอบจะเหมือนกับ dict

print(od['k1'])
# 1

od['k2'] = 200
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

od.update(k4=4, k5=5)
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3), ('k4', 4), ('k5', 5)])

del od['k4'], od['k5']
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

ดูบทความต่อไปนี้สำหรับรายละเอียด

ย้ายองค์ประกอบไปที่จุดเริ่มต้นหรือจุดสิ้นสุด

คุณสามารถใช้วิธีการของ OrderedDict move_to_end() เพื่อย้ายองค์ประกอบไปยังจุดเริ่มต้นหรือจุดสิ้นสุด

ระบุคีย์เป็นอาร์กิวเมนต์แรก ค่าเริ่มต้นคือการย้ายไปยังจุดสิ้นสุด แต่ถ้าอาร์กิวเมนต์ที่สองเป็นเท็จ อาร์กิวเมนต์จะถูกย้ายไปที่จุดเริ่มต้น

od.move_to_end('k1')
print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1)])

od.move_to_end('k1', False)
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

เพิ่มองค์ประกอบใหม่ในตำแหน่งใดก็ได้

สามารถสร้างออบเจ็กต์ OrderedDict ใหม่ด้วยองค์ประกอบใหม่ที่เพิ่มในตำแหน่งใดก็ได้ โดยเฉพาะอย่างยิ่ง สามารถทำได้ในขั้นตอนต่อไปนี้

  1. แสดงรายการอ็อบเจ็กต์มุมมองที่สามารถรับได้ด้วยเมธอด items() โดยใช้ list()
  2. เพิ่มทูเพิล (คีย์ ค่า) ของคู่คีย์-ค่าในเมธอด insert() ของรายการ
  3. สร้างอ็อบเจ็กต์ใหม่โดยส่งต่อไปยังคอลเล็กชันคอนสตรัคเตอร์OrderedDict()
l = list(od.items())
print(l)
# [('k1', 1), ('k2', 200), ('k3', 3)]

l.insert(1, ('kx', -1))
print(l)
# [('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)])

insert() ระบุตำแหน่งที่จะแทรกเป็นอาร์กิวเมนต์แรก และองค์ประกอบที่จะแทรกเป็นอาร์กิวเมนต์ที่สอง

ในตัวอย่าง วัตถุใหม่ถูกกำหนดให้กับตัวแปรดั้งเดิม และไม่มีการเพิ่มองค์ประกอบใหม่ให้กับวัตถุดั้งเดิมเอง

จัดเรียงองค์ประกอบใหม่ (เรียงลำดับใหม่)

การแทนที่องค์ประกอบเป็นกระบวนการเดียวกับในตัวอย่างด้านบน

  1. แสดงรายการอ็อบเจ็กต์มุมมองที่สามารถรับได้ด้วยเมธอด items() โดยใช้ list()
  2. แทนที่องค์ประกอบในรายการ
  3. สร้างอ็อบเจ็กต์ใหม่โดยส่งต่อไปยังคอลเล็กชันคอนสตรัคเตอร์OrderedDict()
l = list(od.items())
print(l)
# [('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)]

l[0], l[2] = l[2], l[0]
print(l)
# [('k2', 200), ('kx', -1), ('k1', 1), ('k3', 3)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k2', 200), ('kx', -1), ('k1', 1), ('k3', 3)])

หากคุณต้องการระบุคีย์และแทนที่ ให้ใช้เมธอด index() เพื่อรับดัชนี (ตำแหน่ง) จากรายการคีย์ดังที่แสดงด้านล่าง

l = list(od.items())
k = list(od.keys())
print(k)
# ['k2', 'kx', 'k1', 'k3']

print(k.index('kx'))
# 1

l[k.index('kx')], l[k.index('k3')] = l[k.index('k3')], l[k.index('kx')]
print(l)
# [('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])

จัดเรียงองค์ประกอบตามคีย์หรือค่า

สร้างรายการของทูเพิล (คีย์, ค่า) ของคู่คีย์-ค่าที่จัดเรียงตามอ็อบเจ็กต์การดูที่สามารถรับได้โดยเมธอด items() และส่งผ่านไปยังคอลเล็กชันคอนสตรัคเตอร์ OrderedDict() เพื่อสร้างอ็อบเจ็กต์ใหม่

การเรียงลำดับทำได้โดยการระบุฟังก์ชันที่ไม่ระบุชื่อ (นิพจน์แลมบ์ดา) ที่ส่งกลับคีย์หรือค่าจากทูเพิล (คีย์, ค่า) เป็นคีย์อาร์กิวเมนต์ของฟังก์ชันในตัว sorted()

หากคุณต้องการกลับลำดับ ให้ตั้งค่าอาร์กิวเมนต์กลับของ sorted() ให้เป็นจริง

print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])

od_sorted_key = collections.OrderedDict(
    sorted(od.items(), key=lambda x: x[0])
)
print(od_sorted_key)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3), ('kx', -1)])

od_sorted_value = collections.OrderedDict(
    sorted(od.items(), key=lambda x: x[1], reverse=True)
)
print(od_sorted_value)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])