collections و itertools
collections & itertools
collections و itertools — أدوات معالجة البيانات الاحترافية
في الدروس السابقة استخدمنا القوائم (list) والقواميس (dict) لحل معظم المشكلات. لكن Python توفر في وحدة collections هياكل بيانات متخصصة تجعل الكود أوضح وأسرع لحالات بعينها. وفي itertools دوال تجعل المعالجة التكرارية فعّالة جداً.
لماذا collections؟
المشكلة الكلاسيكية: عندك قائمة من العناصر وتريد معرفة كم تكرر كل عنصر. الحل الساذج:
# الحل الساذج — Naive solution
تواتر = {}
for عنصر in القائمة:
if عنصر in تواتر:
تواتر[عنصر] += 1
else:
تواتر[عنصر] = 1
ثلاثة أسطر لمهمة أساسية. مع Counter تصبح سطراً واحداً.
Counter — عدّاد التواتر
Counter يقبل أي iterable ويعدّ كم تكرر كل عنصر. الناتج قاموس متخصص مع ميزات إضافية:
defaultdict — قاموس بقيمة افتراضية
المشكلة المألوفة الأخرى: تريد تجميع عناصر في قوائم داخل قاموس، لكن dict يرمي KeyError عند الوصول لمفتاح غير موجود. defaultdict يحلها بأناقة:
namedtuple — سجل خفيف الوزن
namedtuple يُنشئ كلاساً بسيطاً للبيانات بسطر واحد. يجمع بين سهولة tuple (حجم صغير في الذاكرة) ووضوح dict (الوصول بالاسم):
OrderedDict — القاموس المرتّب
في Python 3.7+ القواميس العادية تحفظ الترتيب تلقائياً، لكن OrderedDict لا يزال مفيداً حين تريد المساواة تأخذ الترتيب بعين الاعتبار أو تحتاج move_to_end:
itertools — المعالجة الفعّالة للتسلسلات
itertools توفر دوالاً للعمل على iterables بدون إنشاء قوائم وسيطة كبيرة في الذاكرة — كل دالة تُرجع iterator يُنتج عناصره عند الحاجة فقط.
chain — دمج تسلسلات
groupby — التجميع
combinations — التوليفات
متى تستخدم ماذا؟
| الحاجة | الأداة |
|---|---|
| عدّ تكرارات العناصر | Counter |
| تجميع عناصر في قوائم حسب مفتاح | defaultdict(list) |
| عدّ بدون التحقق من وجود المفتاح | defaultdict(int) |
| بيانات خفيفة بأسماء حقول | namedtuple |
| LRU cache أو ترتيب ذو معنى | OrderedDict |
| دمج عدة iterables | chain |
| التجميع على بيانات مرتّبة | groupby |
| جميع التوليفات الممكنة | combinations |