collections --- ชนิดข้อมูลคอลเลกชันและคอนเทนเนอร์

โมดูลนี้ให้ชนิดข้อมูลคอนเทนเนอร์พิเศษที่เสริมความสามารถของ list, tuple, dict และ set ที่มีอยู่แล้ว ได้แก่ คิวสองทิศทาง (deque), โรงงานสร้าง tuple พร้อมชื่อฟิลด์ (namedtuple()) และ dict ที่รักษาลำดับ (OrderedDict)

คลาส

class collections.deque(iterable: Iterable, maxlen: int, flags: int = 0)

Deque (คิวสองทิศทาง) คือคอนเทนเนอร์คล้ายรายการที่รองรับการเพิ่มและลบสมาชิกจากทั้งสองด้านในเวลา O(1) สร้าง Deque ใหม่โดยระบุอาร์กิวเมนต์ดังนี้:

  • iterable คือ iterable ที่ใช้เติมข้อมูลลงใน deque เมื่อสร้าง สามารถเป็น tuple หรือ list ว่างเพื่อสร้าง deque ที่ว่างเปล่าในตอนแรก

  • ต้องระบุ maxlen และ deque จะถูกจำกัดให้มีความยาวสูงสุดเท่านี้ เมื่อ deque เต็มแล้ว การเพิ่มสมาชิกใหม่จะทำให้สมาชิกจากฝั่งตรงข้ามถูกลบออก

  • flags ที่เป็นตัวเลือกเสริมสามารถกำหนดเป็น 1 เพื่อตรวจสอบการล้นเมื่อเพิ่มสมาชิก

ออบเจกต์ Deque รองรับ bool, len(), การวนซ้ำ และการโหลด/จัดเก็บโดยใช้ subscript นอกจากนี้ยังมีเมธอดดังต่อไปนี้:

append(x: Any) None

เพิ่ม x ทางด้านขวาของ deque ถ้าเปิดใช้งานการตรวจสอบการล้นและไม่มีที่ว่างในคิว จะเกิด IndexError

appendleft(x: Any) None

เพิ่ม x ทางด้านซ้ายของ deque ถ้าเปิดใช้งานการตรวจสอบการล้นและไม่มีที่ว่างในคิว จะเกิด IndexError

pop() Any

ลบและคืนค่าสมาชิกจากด้านขวาของ deque ถ้าไม่มีสมาชิก จะเกิด IndexError

popleft() Any

ลบและคืนค่าสมาชิกจากด้านซ้ายของ deque ถ้าไม่มีสมาชิก จะเกิด IndexError

extend(iterable: Iterable) None

ขยาย deque โดยการเพิ่มสมาชิกทั้งหมดจาก iterable ทางด้านขวา ถ้าเปิดใช้งานการตรวจสอบการล้นและไม่มีที่ว่างใน deque จะเกิด IndexError

collections.namedtuple(name: str, fields: str | Sequence[str]) type

ฟังก์ชันโรงงานสำหรับสร้างชนิด namedtuple ใหม่ที่มีชื่อและชุดฟิลด์ที่กำหนด namedtuple คือคลาสย่อยของ tuple ที่ให้เข้าถึงฟิลด์ได้ทั้งด้วยดัชนีตัวเลขและด้วยชื่อแอตทริบิวต์ Fields คือลำดับของสตริงที่ระบุชื่อฟิลด์ เพื่อความเข้ากันได้กับ CPython สามารถเป็นสตริงที่มีชื่อฟิลด์คั่นด้วยช่องว่างก็ได้ (แต่มีประสิทธิภาพน้อยกว่า) ตัวอย่างการใช้งาน:

from collections import namedtuple

MyTuple = namedtuple("MyTuple", ("id", "name"))
t1 = MyTuple(1, "foo")
t2 = MyTuple(2, "bar")
print(t1.name)
assert t2.name == t2[1]

อินสแตนซ์ยังมีเมธอดดังต่อไปนี้:

collections._asdict() OrderedDict

คืนค่าชื่อฟิลด์และค่าของฟิลด์เป็น OrderedDict

class collections.OrderedDict(*args: Any, **kwargs: Any)

คลาสย่อยของ dict ที่จดจำและรักษาลำดับของคีย์ที่เพิ่มเข้ามา รับรูปแบบตัวสร้างเหมือนกับ dict (iterable ของคู่ (key, value), mapping อื่น หรือ keyword arguments) เมื่อวนซ้ำ ordered dict คีย์/สมาชิกจะถูกคืนค่าตามลำดับที่เพิ่มเข้ามา:

from collections import OrderedDict

# To make benefit of ordered keys, OrderedDict should be initialized
# from sequence of (key, value) pairs.
d = OrderedDict([("z", 1), ("a", 2)])
# More items can be added as usual
d["w"] = 5
d["b"] = 3
for k, v in d.items():
    print(k, v)

ผลลัพธ์:

z 1
a 2
w 5
b 3
popitem() Tuple

ลบและคืนค่าคู่ (key, value) จาก dictionary โดยคืนตามลำดับ LIFO

ความแตกต่างจาก CPython

OrderedDict.popitem() ไม่รองรับอาร์กิวเมนต์ last=False และจะลบและคืนค่าสมาชิกสุดท้ายเสมอถ้ามีอยู่

วิธีแก้ปัญหานี้คือใช้ pop(<first_key>) เพื่อลบสมาชิกแรก:

first_key = next(iter(d))
d.pop(first_key)