4 תשובות
אוסף של דברים
שואל השאלה:
מה זאת אומרת?
לפני שאני מתחילה להסביר, קודם צריך להגיד מה זה set בתאורייה. אז בתאור set/קבוצה זה מבנה נתונים שבו כל איבר יכול לחזור פעם אחת או 0 פעמים ואין אינדקס לאיבריו, ולכן גם אין שום סידור (כלומר אם מוסיפים לו איברים שכבר היו, הset יהיה באותו האורך שהיה בהתחלה).

עכשיו נעבור לחלק שבפייתון עצמו.

set זו פונקציה שמקבלת או שום ארגומנטים או ארגומנט אחד. אם יש 0 ארגומנטים, היא תחזיר set ריק. אם היא מקבלת ארגומנט אחד, הוא יהיה חייב להיות איטרבל (איטרבל הוא אובייקט בפייתון בעל שיטת __iter__, לדוגמה list או tuple או set ועוד) והפונקציה תחזיר set שמכיל את כל האיברים של האיטרבל (תזכרי, בגלל שזה set אז גם יש לזה את אותו התנהגות שהזכרתי לפני, כלומר אם יש איבר שחזר על עצמו יותר מפעם אחת בקוד, אז בזמן הריצה הוא יופיע רק פעם אחת וגם שאר התכונות שהזכרתי).

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

אז בפייתון, set הוא מבנה נתונים שבו כל איבר יכול לחזור על עצמו עד פעם אחת (אפשר לכתוב אותו יותר מפעם אחת, אבל זה לא מגדיל את אורך הset) ואין אף סדר לאיבריו. לעומת מבני נתונים אחרים בפייתון כמו list, אין לו אפשריות כמו slicing (אפשרות להשתמש בחלקים מתוך מבנה הנתונים), indexing (אפשרות להשתמש באיברים מתוך מבנה הנתונים), subscription (אפשרות לקבל ערך של מפתח באובייקט מיפוי כמו dict או mappingproxy) ועוד אחרות, אבל יש לו במקום זה אפשריות אחרות כמו בדיקת אורך, בדיקת שייכות (או אי שייכות) של איברים של לset, הוספת איברים, הסרת איברים וגם כאלו שאינן קיימות לשאר מבני הנתונים. דבר שמאוד חשוב לציין שעוד לא ציינתי, הוא שכל איבריו חייבים להיות hashable, כלומר אובייקטים בעלי שיטת __hash__ ושיטת __eq__, או במילים פשוטות יותר: אובייקטים שאינם ניתנים לשינוי ערכם או ערך איברם, ושלא ניתן להוסיף או להסיר להם או מתוכם איברים חדשים.

בשביל ליצור set יש להשתמש בסוגריים מסולסלות, ובתוכן יש 2 אפשריות שניתן לשים:
1. את האיברים (כבר הסברתי לפני כן על איזה איברים מותר ואיזה איברים לא)
2. comprehension (אני לא יודעת אם יש לי את הזמן להסביר על זה, אבל זה אומר שאת עושה for loop על איטרבל בשורה אחת. זה הסבר נוראי אבל בכנות... אין לי מושג להסביר מה זה, מצטערת)
עכשיו לדוגמאות פרקטיות:

אז אם אני אכתוב בפייתון:
print([6,7,8,8,6]==[8,7,6])

הערך שיודפס יהיה false

לעומת זו, אם אני אכתוב:

print({6,7,8,8,6}=={8,7,6})

הערך שיודפס הוא true

הסיבה היא כזו: למרות שבשני המקרים משווים בין אותם איברים, אבל המבנה הנתונים בו הם נמצאים הוא שונה ובעיקר בתכונותיו. בעוד שבדוגמה הראשונה, מבנה הנתונים הוא list (רשימה) ששם יש חשיבות לכמות הפעמים שאיבר חוזר על עצמו ולסדר האיברים, בדוגמה השנייה יש את ההפך הגמור בכך שאין חשיבות לסדר האיברים ואין חשיבות לכמות הפעמים שאיבר חוזר על עצמו. לכן בראשון מוחזר false (כי השני הרשימות אינן זהות כי יש חשיבות לסדר איברם וכמות הפעמים שהם מופיעים) והשני מוחזר true (כי השני הרשימות זהות כי אין חשיבות לסדר איברם וכמות הפעמים שהם מופיעים)