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)