סטים – פעולות על קבוצות

היכולת השימושית ביותר שסטים נותנים לנו היא האפשרות לבצע בקלות השוואות בין הערכים בסט מסוים לערכים בסט אחר באמצעות סדרה של מתודות מיוחדות. לצורך הדוגמה, נניח שיש לנו זוג סטים. הראשון נקרא zugi והוא נראה ככה:

נכון, המספר 1 לא קשור לשם אבל נשאיר אותו שם לטובת ההדגמה 🙂
הסט השני נקרא e_zugi והוא נראה ככה:

כן אנחנו צריכים גם את ה-2 הזה שם.
עכשיו, נניח שאנחנו רוצים לאתר במהירות את כל הערכים שמופיעים בקבוצה הראשונה (zugi) אבל לא מופיעים בקבוצה השנייה (e_zugi). המתודה difference מבצעת בדיוק את הפעולה הזאת –

שימו לב שמהערכים המתקבלים אפשר ליצור רשימה או סט חדש (ע"י אתחול משתנה חדש) אבל הסטים המקוריים נשארים ללא שינוי מפני ש-difference היא פונקציה אשר מחזירה תוצאה של חישוב.
לעומתה, הפונקציה difference_update מבצעת פעולה על הסט ש"קורא" לה ומשנה אותו. מסיבה זו אין לנו אפשרות להדפיס אותה מפני שמדובר בפעולה ולא בחישוב

אבל אם נריץ את הסט המקורי נראה שהוא השתנה (הערכים המשותפים ל"זוגי" ו-"אי-זוגי" הושמטו מ"זוגי".

מה אם אנחנו רוצים למצוא את הערכים הייחודיים בסט א' אבל מעוניינים גם בערכים ייחודיים בסט ב'? בשביל זה יש לנו את symmetric_difference שתסרוק את שני הצדדים ותחזיר את כל הערכים שמופיעים בצד אחד בלבד. כמובן שבמקרה הזה לא משנה איזה סט "קורא" למתודה ואיזה סט מוצב כפרמטר, התוצאה שנקבל תהיה זהה.

גם ל- symmetric_difference יש את הגרסה המעדכנת. כאן הסדר כן משנה (כמו בדוגמה הקודמת, רק הסט הראשון ישתנה בפועל)

המתודה intersection מבצעת בדיוק את הפעולה ההפוכה מ- symmetric_difference: היא מאתרת את כל הערכים המשותפים לשני הצדדים.

וכן, ניחשתם נכון, אפשר גם להשתמש ב- intersection_update כדי לעדכן את הסט לסט הערכים המשותפים.

ולסיום, המתודה union משמשת לאיחוד של שני סטים (תוך כדי הסרת הכפילויות)

כדי להוסיף את הערכים של סט ב' לסט א' נשתמש פשוט במתודה update.

שלוש נקודות חשובות לגבי Set Operations:

  • כל הדוגמאות שכתבתי מציגות שני סטים אבל למעשה רק הסט הראשון, שעליו אנו מיישמים את המתודה, באמת חייב להיות סט. כל המתודות האלה יכולות לקבל כפרמטר כל רצף שהוא (אפילו מחרוזות טקסט).
  • כל המתודות שהוזכרו כאן מבצעות עדכון על סט או מחזירות סט חדש. בכל מקרה התוצר הסופי הוא תמיד סט ולכן לא נקבל כפילויות גם אם הערכים חוזרים על עצמם בשני הצדדים או מספר פעמים באותו הצד
  • לסטים אין אינדקס ולכן אין סדר מסוים. זאת הסיבה שבחישובים כאלה הערכים יכולים לחזור בכל סדר שהוא (כמו בדוגמה האחרונה). גם במקרה של סטים נוכל להשתמש בפונקציה sorted כדי לקבל את הערכים ממוינים בפורמט של רשימה.

בדיקות בוליאניות על סטים

הנה עוד כמה "שאלות" שאנחנו יכולים לשאול על היחס בין קבוצות בעזרת מתודות בוליאניות (מחזירות לנו ערך של True או False). למשל, אם אנחנו לא מעוניינים לקבל ערכים משותפים בין קבוצות, רק לדעת אם יש כאלה. המתודה isdisjoint תבדוק אם קיימים ערכים משותפים בין 2 הקבוצות (נזכיר שוב שרק הראשונה חייבת להיות סט). במידה ולא נמצאו ערכים משותפים, תחזיר המתודה True, אחרת False.

אם סט ערכים מכיל סט שלם אחר הוא מוגדר כ"סופר סט" (Super Set) ביחס לסט השני. המתודה issuperset תבצע עבורנו את הבדיקה הזאת.

באופן דומה, אם סט נכלל בשלמותו בתוך סט אחר, הוא יוגדר כ"תת סט" (Sub Set) של הסט שני ואת זה נוכל לבדוק בעזרת issubset