set הוא שק לא מסודר של פריטים ייחודיים
רשימות ו-tuples מקפידים על סדר, ו-sets לא. רשימות מאפשרות לכפילויות להצטבר, ו-sets זורקים אותן בשקט. ה-set הוא מבנה הנתונים הנכון כשיש לכם שני צרכים מסוימים:
- אתם רוצים פריטים ייחודיים, נקודה.
- אתם רוצים לבדוק שייכות מהר.
כותבים אחד עם סוגריים מסולסלים:
ה-"red" וה-"green" הכפולים ב-set השני פשוט נעלמים. זו לא שגיאה, זו כל המטרה.
יצירת sets
שתי הדרכים שתשתמשו בהן בפועל:
הנקודה האחרונה תופסת את כולם פעם אחת: {} יוצר dictionary ריק, לא set ריק. הדו-משמעות התחבירית הייתה צריכה ליפול על אחד מהם, וה-dicts ניצחו.
הוספה והסרה
remove מול discard היא ההבחנה החשובה: remove מתעקשת שהפריט יהיה קיים, ול-discard לא אכפת. בחרו לפי השאלה אם היעדר הפריט צריך להיות שגיאה.
בדיקת שייכות מהירה
כאן sets באמת מצדיקים את מקומם. x in some_set רץ בזמן קבוע, לא משנה כמה גדול ה-set. x in some_list צריך לעבור על הרשימה, וזה נהיה איטי כשהרשימה גדולה.
כלל אצבע: בכל פעם שאתם מוצאים את עצמכם כותבים if x in some_list בתוך לולאה, וברשימה יש יותר מכמה עשרות פריטים, המירו קודם את הרשימה ל-set.
מתמטיקה של קבוצות
כאן sets נהיים באמת כיפיים. אפשר לשלב אותם עם אופרטורים שמשקפים פעולות מתמטיות על קבוצות:
לכל אופרטור יש גם צורת מתודה (.union(), .intersection(), .difference(), .symmetric_difference()). האופרטורים קומפקטיים יותר, וצורות המתודה מקבלות כל iterable, לא רק set אחר.
הסרת כפילויות מרשימה
אחד השימושים הנפוצים ביותר ב-sets, גם מחוץ ל"לוגיקת קבוצות":
שורה אחת, והכפילויות נעלמו. דבר אחד לשים לב אליו: הסדר לא נשמר. אם אתם צריכים ייחודיות וגם את הסדר המקורי, השתמשו ב-dict.fromkeys() במקום:
ב-Python מודרנית dicts שומרים על סדר ההכנסה, ו-dict.fromkeys בונה אחד שבו הפריטים של ה-iterable הם המפתחות, ולמעשה זה set מסודר.
תת-קבוצות וקבוצות-על
בדיקה אם set אחד מוכל באחר:
אלה עולים בדברים כמו בדיקות הרשאות ("האם למשתמש הזה יש את כל התפקידים הנדרשים?").
מה יכול להיכנס ל-set
רק פריטים hashable. זה מונח טכני, ובפועל פירושו:
- דברים שאינם ניתנים לשינוי הם hashable: מספרים, מחרוזות, tuples של פריטים hashable, frozensets.
- דברים שניתנים לשינוי לא: רשימות, dicts ו-sets אחרים לא יכולים להיות איברים ב-set.
אם צריך set של sets, השתמשו ב-frozenset: זו גרסה של set שאינה ניתנת לשינוי.
מעבר על set אינו מסודר
לולאה על set נותנת את הפריטים בסדר לא מובטח:
הריצו את זה כמה פעמים ותראו שהסדר משתנה. אם הסדר חשוב, set הוא לא המבנה הנכון: מיינו את התוכן כשאתם צריכים אותו, או השתמשו ברשימה.
מתי לא להשתמש ב-set
אם אחד מאלה נכון, כנראה שרשימה או dict מתאימים יותר:
- הסדר חשוב לכם.
- צריך לשמור כפילויות.
- לכל פריט יש נתונים משויכים (השתמשו ב-dict שבו הפריט הוא המפתח).
ממשיכים הלאה
sets מטפלים בייחודיות ובשייכות. Dictionaries, שמגיעים בעמוד הבא, מטפלים בדפוס הרחב יותר של "מצא ערך לפי מפתח", שהוא כנראה מבנה הנתונים השימושי ביותר ב-Python אחרי הרשימה.
שאלות נפוצות
מה זה set ב-Python?
set הוא אוסף לא מסודר של פריטים ייחודיים. sets נכתבים בסוגריים מסולסלים בלי זוגות מפתח-ערך: colors = {'red', 'green', 'blue'}. הוספת אותו ערך פעמיים לא משפיעה: כפילויות נזרקות בשקט.
מתי להשתמש ב-set במקום ברשימה?
השתמשו ב-set כשחשובה לכם ייחודיות או כשתבצעו בדיקות שייכות רבות (x in collection). sets מסירים כפילויות אוטומטית ובודקים שייכות בזמן קבוע, וזו האצה עצומה לעומת רשימות באוספים גדולים.
איך יוצרים set ריק ב-Python?
השתמשו ב-set(), לא ב-{}: סוגריים מסולסלים ריקים יוצרים dictionary ריק, לא set ריק. אחרי שיש לכם set, אפשר להוסיף פריטים עם .add(value).