מתודות של רשימות#

תזכורת:

  • mutable (בת שינוי) – ניתן לשנות את האובייקט המקורי לאחר יצירתה immutable (בלתי־ניתן לשינוי) – לא ניתן לשנות את האובייקט המקורי לאחר יצירתו. כל שינוי ניתן רק על ידי שכפול והחלפה של ערכים.

  • שיטה (מתודה) היא פונקציה שמוגדרת עבור טיפוס מסוים, והיא “שייכת” לאובייקט שמאותו הטיפוס. האובייקט יכול לקרוא לה כדי לבצע פעולה כלשהי לפי התחביר הבא:

my_object.action()

כעת נכיר מספר מתודות שימושיות של רשימות משנות את הרשימה המקוריות מהן הופעלו#

  • append

  • remove

  • pop

  • sort

append: הוספת איבר לרשימה#

הוספת איבר לסוף הרשימה.

hello_list = ['h','e','l','l','o']
hello_list_new=hello_list.append('!')
print(hello_list) # This is the original list!!
['h', 'e', 'l', 'l', 'o', '!']

שימו לב

המחרוזת “!” נוספת למשתנה המקורי ללא פעולת השמה.

אז מה מחזיר append?#

hello_list = ['h','e','l','l','o']
hello_list_new=hello_list.append('!')
print(hello_list)
['h', 'e', 'l', 'l', 'o', '!']
print(hello_list_new)
None

כלומר הפונקציה לא החזירה כלום, וההשמה לאחר append מיותרת.

hello_list = ['h','e','l','l','o']
hello_list.append('!')
print(hello_list)
['h', 'e', 'l', 'l', 'o', '!']

טיפ להמשך

אם מתודה משנה את האובייקט המקורי, היא כנראה לא תחזיר אותו. למה לעשות פעמיים?

remove: הסרת איבר מרשימה#

המתודה מסירה את האיבר הראשון המתאים לערך שהועבר בקלט

hello_list = ['h','e','l','l','o']
hello_list.remove('e')
print(hello_list)
['h', 'l', 'l', 'o']

מה יקרה אם ננסה להסיר איבר שלא קיים ברשימה?

hello_list = ['h','e','l','l','o']
hello_list.remove('e')
print(hello_list)
hello_list.remove('e')
print(hello_list)
['h', 'l', 'l', 'o']
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[7], line 4
      2 hello_list.remove('e')
      3 print(hello_list)
----> 4 hello_list.remove('e')
      5 print(hello_list)

ValueError: list.remove(x): x not in list

pop: חילוץ איבר מרשימה#

המתודה pop מאפשרת לנו להוציא איבר מרשימה לפי אינדקס וגם לקבל אותו חזרה. כלומר, כשאנחנו קוראים ל־pop(i):

  1. המתודה שומרת את האיבר שנמצא באינדקס i.

  2. היא מוחקת את האיבר הזה מהרשימה.

  3. היא מחזירה לנו את הערך שהיה באינדקס i, כך שנוכל להשתמש בו מיד או לשמור אותו במשתנה.

כך אפשר לעבוד עם איברים ברשימה בלי לאבד אותם, וגם לעדכן את הרשימה בו-זמנית.

hello_list = ['h','e','l','l','o']
res=hello_list.pop(0)
print(hello_list, res)
hello_list.pop() # Note that here we do not assign the popped element to res
print(hello_list, res)
['e', 'l', 'l', 'o'] h
['e', 'l', 'l'] h

שימו לב

פעולה זו לא “שוברת” את כלל האצבע מקודם - המתודה הזו עדיין לא מחזירה את הרשימה המקורית, אלא ערך אחר.

sort: מיון רשימה#

המתודה ממיינת את הרשימה המקורית.

שימו לב שכאשר משתמשים בפונקציה המובנית (built-in function) sorted שראינו כבר, ערך ההחזר הוא רשימה חדשה ממויינת

a = [3,7,1]
b = sorted(a)
print(a)
print(b)
[3, 7, 1]
[1, 3, 7]

לעומת זאת, המתודה sort ממיינת את הרשימה המקורית ואינה מחזירה דבר

a = [3,7,1]
b = a.sort()
print(a)
print(b)
[1, 3, 7]
None

ראינו פה שני דרכים שונות לפעולה של פונקציות:
פונקציות שמשנות את האובייקט המקורי נקראות in-place operation.
לעומתן, פונקציות שיוצרות ערך חדש, מבלי לשנות את האובייקט המקורי, נקראות copy operations.

מתודות פופולריות של רשימה#

להלן טבלה עם מתודות שימושיות עבור רשימות - על חלקן כבר דיברנו ועל חלקן עוד לא. נסו את הפונקציות החדשות כדי לראות מה הן עושות בעצמכם!

שיטה

תיאור

append

מוסיפה פריט לסוף הרשימה

count

מחזירה את מספר הפעמים שהערך מופיע ברשימה

extend

מרחיבה את הרשימה על ידי הוספת פריטים מרשימה אחרת

index

מחזירה את האינדקס הראשון שבו מופיע הערך

insert

מכניסה פריט לפני מיקום מסוים ברשימה

pop

מסירה את הפריט במיקום הנתון ומחזירה אותו (אם לא נמסר אינדקס – תסיר את הפריט האחרון)

remove

מסירה את ההופעה הראשונה של הערך ברשימה

reverse

הופכת את סדר הרשימה (משנה את הרשימה עצמה)

sort

ממיינת את הרשימה (משנה את הרשימה עצמה)

copy

יוצר עותק שטחי של הרשימה

clear

מוחק את כל האיברים מהרשימה (משנה את הרשימה עצמה)

*שיטות מודגשות אינן משנות את הרשימה

# Try these methods!
lst = ["hello", "world", "python"]

נסו בעצמכם#

ממשו את הפונקציה update_playlist(playlist) אשר מקבלת רשימת מחרוזות בה כל מחרוזת היא שם של שיר. הפונקציה תבצע את העדכונים הבאים לרשימה:

  1. תוסיף את השיר החדש “Imagine” לסוף הרשימה (משנה את הרשימה המקורית).

  2. אם “Piano man” כבר מופיע, תוציא את ההופעה הראשונה שלו (משנה את הרשימה המקורית).

  3. תוסיף את השיר “Iris” במקום השני ברשימה (משנה את הרשימה המקורית).

  4. תיצור עותק חדש של הרשימה, ותחזיר את הרשימה בסדר הפוך (בלי לשנות את הרשימה המקורית!)

מלאו את שלד הפונקציה שלפניכם. אם הפונקציה מומשה כהלכה, יודפסו למסך שני True.

def update_playlist(playlist):
    # Write you code here
    pass

old_playlist = ["Piano man", "Bohemian Rhapsody", "Hey Jude"]
print(update_playlist(old_playlist) == ['Imagine', 'Hey Jude', 'Iris', 'Bohemian Rhapsody'])
print(old_playlist == ['Bohemian Rhapsody', 'Iris', 'Hey Jude', 'Imagine'])
False
False