الانتقال إلى المحتوى الرئيسي
الوحدة 8 · الدرس 3 من 431/36 في الدورة~12 min
دروس الوحدة (3/4)

المجموعات: العداد والتقصير

تضيف الوحدة collections أنواع بيانات متخصصة تعمل على توسيع نطاق مجموعات مدمجة. الثلاثة الأكثر استخدامًا: Counter، defaultdict، محمي_INLINE_8.

Counter: حساب التردد

Python
from collections import Counter

parole = ["mela", "pera", "mela", "kiwi", "mela", "pera"]
c = Counter(parole)
# Counter({'mela': 3, 'pera': 2, 'kiwi': 1})

c["mela"]            # 3
c["banana"]          # 0   (default for missing keys, NO KeyError)
c.most_common(2)     # [('mela', 3), ('pera', 2)]

يعمل أيضًا على السلاسل (يحسب الأحرف):

Python
Counter("ciao mondo")
# Counter({'o': 2, 'c': 1, 'i': 1, 'a': 1, ' ': 1, 'm': 1, 'n': 1, 'd': 1})

وهو يدعم عمليات تشبه المجموعة على الأعداد (+، -، &، |) - مفيد جدًا لتجميع الأعداد من مصادر مختلفة.

defaultdict: الإملاء باستخدام الإعداد الافتراضي التلقائي

إملاء، عند الوصول إلى مفتاح مفقود، ** يقوم بإنشائه ** عن طريق الاتصال بـ مصنع.

Python
from collections import defaultdict

gruppi = defaultdict(list)        # factory = list (empty list)
for nome in ["Ada", "Linus", "Ada", "Grace"]:
    gruppi[nome].append(1)
# defaultdict(list, {'Ada': [1, 1], 'Linus': [1], 'Grace': [1]})

بدون defaultdict، سيكون عليك أن تكتب:

Python
gruppi = {}
for nome in [...]:
    if nome not in gruppi:
        gruppi[nome] = []
    gruppi[nome].append(1)

المصانع الشائعة: list، int (افتراضي 0)، set، dict.

namedtuple: مجموعات بأسماء الحقول

طريقة خفيفة الوزن لإنشاء فئات قياسية غير قابلة للتغيير. إنها طائفة، ولكن مع الوصول الميداني بالاسم.

Python
from collections import namedtuple

Punto = namedtuple("Punto", ["x", "y"])
p = Punto(3, 4)
p.x          # 3 (access by name)
p[0]         # 3 (access by index, still a tuple)
p.x + p.y    # 7

# typical use: return multiple values from a function
def divisione(a, b):
    Risultato = namedtuple("Risultato", ["quoziente", "resto"])
    return Risultato(a // b, a % b)

r = divisione(17, 5)
r.quoziente   # 3
r.resto       # 2

(للحالات الأكثر تعقيدًا، يوجد أيضًا dataclasses منذ 3.7 — راجع M9.)

nametuple: سجلات غير قابلة للتغيير وخفيفة الوزن

تقوم الوحدة collections أيضًا بتصدير namedtuple، مما يتيح لك إنشاء كائنات تشبه الفئة خفيفة الوزن بسرعة لتخزين البيانات المنظمة دون كتابة مُنشئات أو أساليب معيارية:

Python
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x, p.y)

جربه

تمرين#python.m8.l3.e1
المحاولات: 0جارٍ التحميل…

بالنظر إلى القائمة `words = ['mela', 'pera', 'mela', 'kiwi', 'mela', 'pera']`، قم بحساب الكلمة الأكثر شيوعًا في `top` كسلسلة. تقييم "الأعلى".

جارٍ تحميل المحرر…
إظهار التلميح

العداد(...).most_common(1) يُرجع [(كلمة، عدد)].

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#python.m8.l3.e2
المحاولات: 0جارٍ التحميل…

بالنظر إلى عمليات التسجيل للطلاب = [('Ada'، 'mate')، ('Linus'، 'fisica')، ('Ada'، 'storia')، ('Grace'، 'mate')]`، قم ببناء "courses_per_student" كقائمة افتراضية. تقييم `dict(courses_per_student)`.

جارٍ تحميل المحرر…
إظهار التلميح

defaultdict(list) ثم لـ s، c في عمليات التسجيل.

الحل متاح بعد 3 من المحاولات

التحدي الإضافي

تمرين#python.m8.l3.e3
المحاولات: 0جارٍ التحميل…

استيراد \`العداد\` من \`المجموعات\`. احسب تكرار الأحرف في السلسلة \`text = "abracadabra"\`. قم بتخزين العداد في \`char_counter\` وقم بتقييمه.

جارٍ تحميل المحرر…
إظهار التلميح

يأخذ العداد السلسلة كمعلمة ويحسب تكرارات كل حرف.

الحل متاح بعد 3 من المحاولات