دروس الوحدة (3/4)
المجموعات: العداد والتقصير
تضيف الوحدة collections أنواع بيانات متخصصة تعمل على توسيع نطاق
مجموعات مدمجة. الثلاثة الأكثر استخدامًا: Counter، defaultdict،
محمي_INLINE_8.
Counter: حساب التردد
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)]يعمل أيضًا على السلاسل (يحسب الأحرف):
Counter("ciao mondo")
# Counter({'o': 2, 'c': 1, 'i': 1, 'a': 1, ' ': 1, 'm': 1, 'n': 1, 'd': 1})وهو يدعم عمليات تشبه المجموعة على الأعداد (+، -، &، |) - مفيد جدًا لتجميع الأعداد من مصادر مختلفة.
defaultdict: الإملاء باستخدام الإعداد الافتراضي التلقائي
إملاء، عند الوصول إلى مفتاح مفقود، ** يقوم بإنشائه ** عن طريق الاتصال بـ مصنع.
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، سيكون عليك أن تكتب:
gruppi = {}
for nome in [...]:
if nome not in gruppi:
gruppi[nome] = []
gruppi[nome].append(1)المصانع الشائعة: list، int (افتراضي 0)، set، dict.
namedtuple: مجموعات بأسماء الحقول
طريقة خفيفة الوزن لإنشاء فئات قياسية غير قابلة للتغيير. إنها طائفة، ولكن مع الوصول الميداني بالاسم.
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، مما يتيح لك إنشاء كائنات تشبه الفئة خفيفة الوزن بسرعة لتخزين البيانات المنظمة دون كتابة مُنشئات أو أساليب معيارية:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x, p.y)جربه
بالنظر إلى القائمة `words = ['mela', 'pera', 'mela', 'kiwi', 'mela', 'pera']`، قم بحساب الكلمة الأكثر شيوعًا في `top` كسلسلة. تقييم "الأعلى".
إظهار التلميح
العداد(...).most_common(1) يُرجع [(كلمة، عدد)].
الحل متاح بعد 3 من المحاولات
تمرين المراجعة
بالنظر إلى عمليات التسجيل للطلاب = [('Ada'، 'mate')، ('Linus'، 'fisica')، ('Ada'، 'storia')، ('Grace'، 'mate')]`، قم ببناء "courses_per_student" كقائمة افتراضية. تقييم `dict(courses_per_student)`.
إظهار التلميح
defaultdict(list) ثم لـ s، c في عمليات التسجيل.
الحل متاح بعد 3 من المحاولات
التحدي الإضافي
استيراد \`العداد\` من \`المجموعات\`. احسب تكرار الأحرف في السلسلة \`text = "abracadabra"\`. قم بتخزين العداد في \`char_counter\` وقم بتقييمه.
إظهار التلميح
يأخذ العداد السلسلة كمعلمة ويحسب تكرارات كل حرف.
الحل متاح بعد 3 من المحاولات