דילוג לתוכן המרכזי
מודול 8 · שיעור 3 מתוך 431/36 בקורס~12 min
שיעורי מודול (3/4)

אוספים: Counter ו-defaultdict

המודול collections מוסיף סוגי נתונים מיוחדים המרחיבים את אוספים מובנים. שלושת המשמשים ביותר: Counter, defaultdict, namedtuple.

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: dict עם ברירת מחדל אוטומטית

הכתבה שכאשר אתה ניגש למפתח חסר, יוצר אותו על ידי קריאה ל-a מפעל.

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.)

namedtuple: תקליטים קלים משקל בלתי ניתנים לשינוי

המודול 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טוען...

בהינתן הרשימה 'מילים = ['mela', 'pera', 'mela', 'kiwi', 'mela', 'pera']`, חשב את המילה השכיחה ביותר ב-'top' כמחרוזת. העריכו את 'טופ'.

טוען עורך...
הצג רמז

Counter(...).most_common(1) מחזיר [(מילה, ספירה)].

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#python.m8.l3.e2
ניסיונות: 0טוען...

בהינתן 'הרשמות' לתלמידים = [('עדה', 'חבר'), ('לינוס', 'פיסיקה'), ('עדה', 'סטוריה'), ('חסד', 'חבר')], בנה 'קורסים_לתלמיד' כברירת מחדל(רשימה). הערך את `dict(courses_per_student)`.

טוען עורך...
הצג רמז

defaultdict(list) ואז עבור s, c בהרשמות.

הפתרון זמין לאחר 3 ניסיונות

אתגר נוסף

פעילות גופנית#python.m8.l3.e3
ניסיונות: 0טוען...

יבא את \`מונה\` מ\`אוספים\`. ספור את תדירות התווים במחרוזת \`text = "abracadabra"\`. אחסן את המונה ב-\`char_counter\` והעריך אותו.

טוען עורך...
הצג רמז

מונה לוקח את המחרוזת כפרמטר וסופר את המופעים של כל אות.

הפתרון זמין לאחר 3 ניסיונות