רשימות הן רצפים מסודרים שניתנים לשינוי
הרשימה היא סוג האוסף הנפוץ ביותר ב-Python. אם אתם שומרים קבוצה מסודרת של ערכים שעשויה להשתנות, כלומר להוסיף, להסיר, למיין ולעדכן, רשימה היא כמעט תמיד הבחירה הנכונה.
יוצרים אחת עם סוגריים מרובעים:
רשימות יכולות להחזיק כל דבר, אפילו רשימות אחרות. בפועל, רוב הרשימות מחזיקות סוג אחד של דבר, כמו רשימת משתמשים או רשימת מספרים, כי כך הכי קל לחשוב עליהן.
אינדקסים
לכל פריט יש מיקום, שמתחיל ב-0. ניגשים אליו עם סוגריים מרובעים:
בקשה של אינדקס שלא קיים זורקת IndexError. אם ייתכן שתחרגו מהטווח, בדקו קודם את האורך או עטפו את הגישה ב-try.
Slicing
slicing נותן לכם טווח של פריטים. התחביר הוא list[start:stop:step], בדיוק כמו במחרוזות:
שני דברים שכדאי לקבע:
- slicing תמיד מחזיר רשימה חדשה. שינוי של ה-slice לא משפיע על המקור.
- אינדקס הסיום אינו כלול:
nums[2:5]נותן את האינדקסים 2, 3 ו-4, לא את 5.
איך מוסיפים פריטים עם append, extend ו-insert
שלוש המתודות "להוספה לרשימה" עושות דברים שונים, ובלבול ביניהן הוא מקור נפוץ לבאגים:
append(x)מוסיפה אתxכאיבר יחיד, גם אםxהוא רשימה.items.append([1, 2])מוסיפה את הרשימה עצמה כרשומה אחת.extend(iterable)מוסיפה כל פריט מתוך ה-iterable.items.extend([1, 2])מוסיפה שתי רשומות.insert(i, x)מכניסה באינדקס מסוים ומזיזה כל מה שנמצא ב-iואחריו מקום אחד קדימה.
+= עם רשימה בצד השני עובד כמו extend:
ולהסרה:
אם תנסו לבצע remove() למשהו שלא נמצא ברשימה, Python זורקת ValueError. אם אתם צריכים "הסר אם קיים", בדקו קודם עם in או השתמשו ב-try.
אפשר גם למחוק לפי אינדקס עם del:
אורך, שייכות וספירה
in היא הדרך הקריאה לבדוק אם רשימה מכילה ערך. אם תשאלו את השאלה הזו פעמים רבות על רשימה גדולה, השתמשו ב-set במקום: בדיקת שייכות ב-set היא O(1), וברשימה היא O(n).
מיון
שתי דרכים, והבחירה ביניהן חשובה:
שתיהן מקבלות reverse=True לסדר יורד:
ופונקציית key לסדר מותאם:
key מופעלת על כל פריט, והתוצאה היא מה שמושווה. מקרים נפוצים: מיון לפי אורך, לפי attribute מסוים, או לפי הגרסה באותיות קטנות של מחרוזת.
היפוך סדר
שלוש אפשרויות, לפי מה שצריך:
השתמשו בהיפוך במקום כשלא צריך את המקור. השתמשו ב-slicing כשרוצים עותק חדש. השתמשו ב-reversed() כשצריך רק לעבור בסדר הפוך בלי ליצור רשימה חדשה.
מלכודת ההפניה המשותפת
רשימות הן ניתנות לשינוי (mutable), ומשתנים הם הפניות. זה אומר ששני משתנים יכולים להצביע על אותה רשימה:
b = a לא העתיקה את הרשימה, היא הפכה את b לשם שני של אותה רשימה. אם אתם רוצים עותק, בקשו אחד:
זה נושך כל מתכנת Python לפחות פעם אחת. זכרו: = בין שתי רשימות לא מעתיק.
מעבר בלולאה ובנייה
את הדפוס הבסיסי אתם כבר מכירים מהעמוד על לולאת for:
זה קריא ותמיד יהיה בסדר. כשתרגישו בנוח, ה-list comprehension השקולה עושה את אותו הדבר בשורה אחת:
נסביר comprehensions לעומק בעוד שני עמודים.
דף עזר מהיר
מתודות שכדאי להכיר, במבט אחד:
append(x): הוספה לסוףextend(iter): הוספת כל פריט מ-iterableinsert(i, x): הכנסה באינדקס ipop()/pop(i): הסרה והחזרהremove(x): הסרת ההופעה הראשונה של xsort()/sort(key=...)/sort(reverse=True)reverse()index(x): המיקום של ה-x הראשוןcount(x): מספר ההופעות של xcopy(): עותק רדוד
הצעד הבא
רשימות הן סוס העבודה. בהמשך נכיר את ה-tuples, בני הדודים שאינם ניתנים לשינוי, ונראה מתי עדיף לבחור ב-tuple.
שאלות נפוצות
איך יוצרים רשימה ב-Python?
השתמשו בסוגריים מרובעים עם ערכים מופרדים בפסיקים: fruits = ['apple', 'banana', 'cherry']. רשימות יכולות להחזיק כל טיפוס, ואפשר לערבב טיפוסים באותה רשימה, אם כי רוב הרשימות האמיתיות אחידות מתוך הרגל.
איך ממיינים רשימה ב-Python?
קראו ל-.sort() על הרשימה כדי למיין אותה במקום, או השתמשו בפונקציה המובנית sorted(list) כדי לקבל רשימה ממוינת חדשה בלי לשנות את המקורית. שתיהן מקבלות את הדגל reverse=True לסדר יורד ואת הארגומנט key= למפתחות מיון מותאמים.
איך הופכים את סדר הרשימה ב-Python?
list.reverse() הופכת את הסדר במקום. list[::-1] מחזירה רשימה הפוכה חדשה. reversed(list) מחזירה iterator שאפשר לעבור עליו בלולאה. בחרו לפי הצורך: שינוי במקום, עותק חדש או מעבר עצל.