الدرس 5 من 10
التجميع بـ defaultdict
- 11 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
التجميع في أقسام بلا KeyError
الشرح
التجميع يحوّل قائمة واحدة طويلة إلى أقسام، كأن تجمع الطلاب بحسب المدينة أو الطلبات بحسب العميل. والقاموس العادي يتعثّر عند أول عنصر من كل قسم، لأن groups[city].append(name) تسبّب الخطأ KeyError ما دامت قائمة المدينة لم تُنشأ بعد.
وdefaultdict(list) من collections يحلّ هذه المشكلة، فإذا طلبت منه مفتاحًا غير موجود أنشأ له قائمة فارغة وأعطاك إيّاها، فيصير التجميع سطرًا واحدًا داخل الحلقة. وانتبه إلى أن ما تمرّره إليه دالة تصنع القيمة الأولى وليس القيمة نفسها، فتكتب list وليس [].
والفخّ هنا أن مجرّد قراءة مفتاح غير موجود يُنشئه، فالسطر if groups["أبها"]: يضيف «أبها» بقائمة فارغة مع أنك كنت تسأل فقط، لذلك استعمل in أو .get() إذا أردت أن تعرف هل المفتاح موجود.
المطلوب
جمّع students في by_city باستعمال defaultdict(list)، بحيث يكون المفتاح هو المدينة والقيمة أسماء طلابها بترتيبهم الأصلي، ثم اطبع كل مدينة مع أسماء طلابها في سطر.
الفحوص
5 فحوص- الرياض فيها ثلاثة أسماء بترتيبها الأصلي
- جدة والدمام بأسمائهما
- ثلاث مدن بلا قسم زائد
- القاموس by_city من نوع defaultdict(list)
- طُبعت كل مدينة مع أسمائها في سطر