collections --- أنواع المجموعات والحاويات¶
توفر هذه الوحدة أنواع بيانات حاوية متخصصة تكمّل الأنواع المدمجة list و tuple و dict و set: طابور مزدوج الطرفين (deque)، ومصنع لإنشاء صفوف ذات حقول مسماة (namedtuple())، وقاموس يحافظ على ترتيب العناصر (OrderedDict).
الأصناف¶
- class collections.deque(iterable: Iterable, maxlen: int, flags: int = 0)¶
الطوابير المزدوجة (deques) هي حاوية شبيهة بالقائمة تدعم عمليات الإضافة والإزالة من أي من طرفيها بزمن O(1). تُنشأ الطوابير الجديدة باستخدام المعطيات التالية:
iterable هو كائن قابل للتكرار يُستخدم لملء الطابور عند إنشائه. يمكن أن يكون صفاً أو قائمة فارغة لإنشاء طابور يبدأ فارغاً.
يجب تحديد maxlen، وسيكون الطابور محدوداً بهذا الطول الأقصى. وبمجرد امتلاء الطابور، فإن أي عناصر جديدة تُضاف ستتسبب في التخلص من عناصر من الطرف المقابل.
يمكن أن تكون قيمة flags الاختيارية 1 للتحقق من تجاوز السعة عند إضافة العناصر.
تدعم كائنات الطابور
boolوlen()والتكرار وقراءة وتخزين العناصر عبر الفهرسة. كما أن لها الطرائق التالية:- append(x: Any) None¶
تضيف x إلى الجانب الأيمن من الطابور. تُطلق
IndexErrorإذا كان التحقق من تجاوز السعة مفعّلاً ولم يبقَ مكان في الطابور.
- appendleft(x: Any) None¶
تضيف x إلى الجانب الأيسر من الطابور. تُطلق
IndexErrorإذا كان التحقق من تجاوز السعة مفعّلاً ولم يبقَ مكان في الطابور.
- pop() Any¶
تزيل وتُرجع عنصراً من الجانب الأيمن من الطابور. تُطلق
IndexErrorإذا لم تكن هناك عناصر.
- popleft() Any¶
تزيل وتُرجع عنصراً من الجانب الأيسر من الطابور. تُطلق
IndexErrorإذا لم تكن هناك عناصر.
- extend(iterable: Iterable) None¶
توسّع الطابور بإلحاق جميع العناصر من iterable إلى الجانب الأيمن منه. تُطلق
IndexErrorإذا كان التحقق من تجاوز السعة مفعّلاً ولم يبقَ مكان في الطابور.
- collections.namedtuple(name: str, fields: str | Sequence[str]) type¶
هذه دالة مصنع لإنشاء نوع namedtuple جديد باسم محدد ومجموعة من الحقول. إن namedtuple هو صنف فرعي من tuple يتيح الوصول إلى حقوله ليس فقط عبر الفهرس الرقمي، بل أيضاً عبر صياغة الوصول إلى السمات باستخدام أسماء حقول رمزية. الحقول هي تسلسل من السلاسل النصية يحدد أسماء الحقول. وللتوافق مع 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(كائن قابل للتكرار من أزواج(key, value)، أو خريطة أخرى، أو وسائط مفتاحية). عند التكرار على القاموس المرتب، تُرجع المفاتيح/العناصر بالترتيب الذي أُضيفت به: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) من القاموس. تُرجع الأزواج بترتيب LIFO (آخر داخل، أول خارج).
الفرق عن CPython
إن
OrderedDict.popitem()لا يدعم الوسيطlast=Falseوسيزيل ويُرجع دائماً آخر عنصر إن وُجد.أحد الحلول البديلة لهذا هو استخدام
pop(<first_key>)لإزالة العنصر الأول:first_key = next(iter(d)) d.pop(first_key)