พจนานุกรม 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)])
ดูบทความต่อไปนี้สำหรับรายละเอียด
- บทความที่เกี่ยวข้อง:การเพิ่มองค์ประกอบลงในพจนานุกรมและการรวมพจนานุกรมใน Python
ย้ายองค์ประกอบไปที่จุดเริ่มต้นหรือจุดสิ้นสุด
คุณสามารถใช้วิธีการของ 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 ใหม่ด้วยองค์ประกอบใหม่ที่เพิ่มในตำแหน่งใดก็ได้ โดยเฉพาะอย่างยิ่ง สามารถทำได้ในขั้นตอนต่อไปนี้
- แสดงรายการอ็อบเจ็กต์มุมมองที่สามารถรับได้ด้วยเมธอด items() โดยใช้ list()
- เพิ่มทูเพิล (คีย์ ค่า) ของคู่คีย์-ค่าในเมธอด insert() ของรายการ
- สร้างอ็อบเจ็กต์ใหม่โดยส่งต่อไปยังคอลเล็กชันคอนสตรัคเตอร์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() ระบุตำแหน่งที่จะแทรกเป็นอาร์กิวเมนต์แรก และองค์ประกอบที่จะแทรกเป็นอาร์กิวเมนต์ที่สอง
ในตัวอย่าง วัตถุใหม่ถูกกำหนดให้กับตัวแปรดั้งเดิม และไม่มีการเพิ่มองค์ประกอบใหม่ให้กับวัตถุดั้งเดิมเอง
จัดเรียงองค์ประกอบใหม่ (เรียงลำดับใหม่)
การแทนที่องค์ประกอบเป็นกระบวนการเดียวกับในตัวอย่างด้านบน
- แสดงรายการอ็อบเจ็กต์มุมมองที่สามารถรับได้ด้วยเมธอด items() โดยใช้ list()
- แทนที่องค์ประกอบในรายการ
- สร้างอ็อบเจ็กต์ใหม่โดยส่งต่อไปยังคอลเล็กชันคอนสตรัคเตอร์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)])