קבוצות ב-Python — אוסף עוצמתי שכל מפתח צריך להשתמש בו
- ולריה איינבינדר
- תוכנה
- 10 Sep, 2024
הקדמה
ישנם שלושה אוספי Python בסיסיים: רשימה (list), מילון (dictionary), וקבוצה (set). בעוד ש-רשימה ו-מילון נפוצים מאוד בשימוש כמעט בכל קוד Python, ה-קבוצה לפעמים מרגישה קצת פחות מוערכת, למרות שהיא לא צריכה להיות כזאת!
קבוצה ב-Python היא אוסף שימושי במיוחד שמאפשר לכם לכתוב קוד מאוד יעיל ואלגנטי בזכות התכונות והפונקציונליות המיוחדות שלה.
שליטה בקבוצות תשפר משמעותית את הקוד שלכם ותקצר את זמן הפיתוח. אז בואו נצלול לעומק ל-קבוצות ב-Python ללא עיכובים נוספים!
אתם מוזמנים לצפות בסרטון שלי על קבוצות ב-Python עם דוגמאות קוד להבנה טובה יותר.
נתחיל במשימה מניעה: איך מקבלים ערכים ייחודיים מתוך רשימה שעשויה להכיל כפילויות?
באמצעות קבוצה ב-Python, אפשר לעשות זאת בשורת קוד אחת על ידי יצירת קבוצה מתוך ה-רשימה הנתונה:
שימו לב שעכשיו הקבוצה שלנו unique_names
אינה מכילה כפילויות. זה מדגים את אחת משתי התכונות העיקריות של קבוצה:
האלמנטים בקבוצה הם ייחודיים.
בואו נדון בשתי התכונות העיקריות של הקבוצה בפירוט רב יותר.
תכונות של קבוצה
קבוצות מיישמות שתי תכונות עיקריות שמבדילות אותן באופן משמעותי מרשימות:
- האלמנטים בקבוצה הם ייחודיים
- האלמנטים בקבוצה אינם מסודרים
במבט ראשון, זה עשוי להיראות מוזר — למה להשתמש באוסף שלא תומך בסדר ושאינו מאפשר כפילויות כאשר יש לנו רשימות שאין להן את המגבלות הללו?
התשובה היא שאלה אינן מגבלות, אלא תכונות חשובות שיכולות למנוע באגים פוטנציאליים ולאפשר פונקציונליות ייחודית. בואו נבחן כמה דוגמאות.
דוגמה 1: ערים שאירחו את האולימפיאדה
נניח שאתם רוצים לשמור את כל הערים שאי פעם אירחו את המשחקים האולימפיים. זה הגיוני מאוד להשתמש ב-קבוצה במקום רשימה:
- אתם רוצים שכל עיר תופיע רק פעם אחת, גם אם היא אירחה מספר פעמים.
- אין צורך בסדר, שכן אין דירוג פנימי בין הערים.
דוגמה 2: פירות שגדלים בישראל
אתם רוצים לשמור את כל הפירות שגדלים בישראל. אותם עקרונות חלים גם כאן:
- אינכם רוצים כפילויות באוסף הפירות שלכם.
- אין צורך בסדר מסוים.
כעת, בואו נראה כיצד תכונות אלו מיושמות בקבוצות.
ייחודיות
בקוד הבא, יש לנו רשימה של חודשי גשם בישראל בשלוש השנים האחרונות. מכיוון שישנם חודשי חורף שחוזרים על עצמם, יש כפילויות ב-rainy_months_list.
אם נרצה לקבל קבוצה ייחודית של חודשי גשם בישראל, כל מה שעלינו לעשות הוא ליצור קבוצה מתוך rainy_months_list:
ה-קבוצה מסירה אוטומטית את כל הכפילויות מהאוסף ההתחלתי. בנוסף, קבוצות שומרות על ייחודיות בכך שהן מונעות הוספת כפילויות. בקוד הבא, אתם יכולים לראות ניסיון להוסיף אלמנט כפול ל-קבוצה, אך היא נשארת ללא שינוי:
היעדר סדר
מכיוון ש-קבוצות אינן תומכות בסדר, ניסיון לגשת לאלמנט במיקום ספציפי יגרום לשגיאה:
עם זאת, אנו יכולים לאתר את האלמנטים בקבוצה כמו בכל אוסף אחר, אך סדר האלמנטים במהלך האיתור אינו מובטח ויכול להשתנות:
פונקציונליות מיוחדת של קבוצה
כעת, לאחר שדיברנו על תכונות של קבוצה, בואו נבחן כמה פונקציות עוצמתיות ש-קבוצות ב-Python מיישמות:
- חיתוך (Intersection)
- איחוד (Union)
- הפרש (Difference)
אם אתם מכירים את תורת הקבוצות, אלו בדיוק הפעולות המוגדרות שם. אם לא, הדיאגרמה הזו תעזור לכם להבין אותן:
בואו נראה את הפעולות האלו בפעולה עם כמה דוגמאות קוד. תחילה, ניצור שלוש קבוצות לעבוד איתן:
weekdays
מכילה את כל שבעת ימי השבוע.sport_days
מייצגת את הימים בהם אני מתאמנת.lecture_days
הם הימים בהם אני מלמדת.
אנו נשתמש בפעולות קבוצה כדי לקבל תובנות מתוך הקבוצות הללו.
חיתוך
מהם הימים בהם אני מלמדת בבוקר וגם מתאמנת בערב?
כדי לענות על כך, עלינו למצוא אלמנטים שמשותפים גם ל-sport_days
וגם ל-lecture_days
, כלומר החיתוך של הקבוצות. אפשר לעשות זאת בשורת קוד אחת באמצעות המתודה intersection
:
איחוד
באילו ימים יש לי משהו בלוח הזמנים שלי (כלומר, מה הם הימים העמוסים שלי)?
אלו הם הימים שמופיעים או ב-sport_days
או ב-lecture_days
, מה שמתאים להגדרה של איחוד. נשמור את הימים הללו כ-busy_days
:
הפרש
אני מתכנת טיול חד-יומי עם חברים. באילו ימים אני פנויה לחלוטין?
הימים הפנויים הם ה-הפרש בין weekdays
לבין busy_days
— ימים שמופיעים ב-weekdays
אך לא מופיעים ב-busy_days
:
סיכום
מזל טוב! הוספתם כלי עוצמתי לארגז הכלים שלכם ב-Python!
כעת הגיע הזמן ליישם את מה שלמדתם. חשבו על הפרויקטים האחרונים שלכם ב-Python. האם היו נתונים עם תכונות של קבוצה אך מומשו באמצעות רשימות או אוספים אחרים? אם כן, נסו לכתוב מחדש את הקוד כך שישתמש ב-קבוצות כשמתאים.
אתם יכולים למצוא את כל הקוד שהוצג כאן ב-GitHub שלי.
תודה על הקריאה!