בקורס "תכנות וניתוח נתונים בשפת פייתון", הבנה מעמיקה של מבני הנתונים המובנים היא קריטית לארגון יעיל של מידע ולביצוע פעולות מורכבות. יחידה זו תתמקד ברשימות, טאפלים, מילונים וקבוצות – ארבעה כלים חיוניים המאפשרים למתכנתים לאחסן, לגשת ולעבד נתונים בצורות שונות, תוך התחשבות בצרכים ספציפיים של כל בעיה. שליטה במבנים אלו חיונית לכתיבת קוד פייתון יעיל, קריא וקל לתחזוקה, והיא מהווה אבן יסוד במבחנים.
מושגי יסוד במבני נתונים
לפני שנצלול לפרטים, נכיר מושגי יסוד המאפיינים מבני נתונים אלו.
סקירה מפורטת של מבני הנתונים
רשימות (Lists)
הרשימות הן מבנה הנתונים הנפוץ והגמיש ביותר בפייתון, מאפשרות לאחסן אוסף של פריטים בסדר מסוים.
- מאפיינים: ניתנות לשינוי (mutable), סדורות (ordered), מאפשרות כפילויות, נגישות באמצעות אינדקסים.
- שימושים נפוצים: אחסון אוספים של פריטים שצפויים להשתנות, ערימות (stacks), תורים (queues).
- פעולות עיקריות: הוספת פריטים (
append(),insert()), הסרת פריטים (remove(),pop()), גישה לפי אינדקס (my_list[index]), חיתוך (slicing).
טאפלים (Tuples)
טאפלים דומים לרשימות אך הם בלתי ניתנים לשינוי, מה שהופך אותם לבטוחים יותר במצבים מסוימים.
- מאפיינים: בלתי ניתנים לשינוי (immutable), סדורים (ordered), מאפשרים כפילויות, נגישים באמצעות אינדקסים.
- שימושים נפוצים: אחסון נתונים שאינם אמורים להשתנות (למשל, קואורדינטות), מפתחות למילונים (כיוון שהם immutable), החזרת מספר ערכים מפונקציה.
- פעולות עיקריות: גישה לפי אינדקס, חיתוך. לא ניתן להוסיף, להסיר או לשנות אלמנטים לאחר היצירה.
מילונים (Dictionaries)
מילונים מאחסנים זוגות של מפתח-ערך (key-value pairs), ומאפשרים גישה מהירה לערכים באמצעות מפתחות.
- מאפיינים: ניתנים לשינוי (mutable), סדורים (ordered) החל מפייתון 3.7, מפתחות ייחודיים (ערכים יכולים להיות כפולים), נגישים באמצעות מפתחות. מפתחות חייבים להיות בלתי ניתנים לשינוי.
- שימושים נפוצים: ייצוג אובייקטים עם תכונות, מפות hash, אחסון הגדרות תצורה.
- פעולות עיקריות: גישה לערך (
my_dict[key]), הוספה/עדכון (my_dict[key] = value), הסרה (del my_dict[key],pop()), קבלת מפתחות/ערכים/פריטים (keys(),values(),items()).
קבוצות (Sets)
קבוצות הן אוספים של פריטים ייחודיים, ללא סדר מוגדר, התומכים בפעולות מתמטיות של קבוצות.
- מאפיינים: ניתנות לשינוי (mutable – ניתן להוסיף/להסיר אלמנטים), לא סדורות (unordered), לא מאפשרות כפילויות.
- שימושים נפוצים: הסרת כפילויות מאוסף, בדיקת חברות יעילה, ביצוע פעולות קבוצתיות (איחוד, חיתוך, הפרש).
- פעולות עיקריות: הוספה (
add()), הסרה (remove(),discard()), איחוד (union()), חיתוך (intersection()), הפרש (difference()).
רשימות (Lists)
אוסף סדור ומשתנה של פריטים, מאפשר כפילויות. מתאים לאחסון נתונים שצפויים להשתנות.
טאפלים (Tuples)
אוסף סדור וקבוע של פריטים, מאפשר כפילויות. מתאים לנתונים קבועים או כ"רשומות" קלות משקל.
מילונים (Dictionaries)
אוסף של זוגות מפתח-ערך משתנים, מפתחות ייחודיים. מתאים לייצוג אובייקטים או לגישה מהירה לנתונים לפי מזהה.
קבוצות (Sets)
אוסף לא סדור ומשתנה של פריטים ייחודיים. מתאים להסרת כפילויות ולפעולות קבוצתיות.
בחירת מבנה הנתונים הנכון: מתי להשתמש במה?
שיקולים מרכזיים:
- האם הנתונים צפויים להשתנות? אם כן, רשימה, מילון או קבוצה. אם לא, טאפל.
- האם סדר הפריטים חשוב? אם כן, רשימה או טאפל. מילונים סדורים החל מ-3.7. קבוצות אינן סדורות.
- האם יש צורך בפריטים ייחודיים בלבד? אם כן, קבוצה. אם לא, רשימה או טאפל.
- כיצד ניגשים לנתונים? אם לפי אינדקס מספרי, רשימה או טאפל. אם לפי מזהה ייחודי, מילון. אם רק בודקים נוכחות, קבוצה.
- ביצועים: גישה לפי מפתח במילון או בדיקת חברות בקבוצה הן בדרך כלל מהירות יותר (בזמן ממוצע) מאשר חיפוש ברשימה ארוכה.
שאלות לדיון
- תיאר/י מצב שבו טאפל יהיה בחירה טובה יותר מרשימה, והסבר/י מדוע.
- כיצד ניתן להשתמש במילון כדי לייצג מידע על סטודנטים בקורס, ומהם היתרונות של גישה זו לעומת שימוש ברשימה של רשימות?
- מה ההבדל המהותי בין שימוש ב-
list(set(my_list))לבין לולאה ידנית להסרת כפילויות מרשימה קיימת, ומתי תבחר/י בכל אחת מהשיטות? - האם ניתן להשתמש ברשימה כמפתח במילון? נמק/י.