List Comprehension#
עד כה ראינו מגוון תרחישים בהם נרצה לבנות רשימות. תרחיש נפוץ הוא בניית רשיהמ תוך הוספת אלמנט בכל איטרציה של הלולאה
במקרים הרבים הלולאות יכולה להיות מאוד קצרה: לדוגמא, כדי לבנות את רשימת המספרים הריבועיים מ1 עד 10, נוכל לכתוב את קטע הקוד הבא:
lst=[]
for i in range(1,11):
lst.append(i**2)
דוגמא אחרת היא הדפסת ריבועי המספרים המוכלים ברשימה אחרת (lst_included):
lst_included=[1,5,11,12]
lst=[]
for i in range(1,11):
if i in lst_included:
lst.append(i**2)
המפתחים של פייתון הבינו שיש שימו רב בלולאות קצרות בסגנון הזה, ופיתחו עבורנו מנגנון שמאפשר לקצר חלק משמעותי מהתחביר הנדרש. למנגנון זה קוראים List comprehension.
באמצעות מנגנון זה, ניתן ליצור רשימה חדשה, ליצור לולאה, למלא את הרשימה ואף להוסיף תנאים - והכל בשורה אחת!
המבנה הכי פשוט של List comprehension נראה כך: [expression for item in list]
נדגים מבנה זה ע”י מימוש הדוגמא הראשונה לעיל עם List comprehension:
[i**2 for i in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
בList comprehension אנו כותבים את כל בפעולות בשורה אחת אך בסדר מעט שונה. תחילה אנו כותבים את הערך שהרצה להוסיף לרשימה ורק לאחריו את הלולאה (for). לבסוף, שימו לי כי כל הביטוי עטוף בסוגריים מרובעים, המייצגים את הרשימה החדשה שנוצרה
מבנה יותר מורכב של List comphresnion יראה כך: [expression for item in list if condition]
נדגים אותו באמצעות הדוגמא שניה שהצגנו לעיל:
lst_included=[2,5,11,12]
[i**2 for i in range(1,11) if i in lst_included]
[4, 25]
שימו לב
התנאי כאן בא לאחר הלולאה. למעשה אנו יכולים להגיד כי חלקי הביטוי הקשורים לערך החדש שיתווסף לרשימה יופיעו תחילה ולאחר מכן יופיעו כל הפקודות שבאות מעליו בסדר דומה לכתיב הרגיל שראינו עד כה - רק בשורה אחת.
נשנה כעת את הדוגמא האחרונה שראינו, ונגדיר כי נעלה בריבוע כל מספר זוגי ונכפיל כל מספר אי זוגי שמופיע ברשימה lst_included.
המימוש שראינו עד לפרק זה ישתמש בלולאות for בצורה הקלאסית באופן הבא:
lst_included=[1,5,11,12]
lst=[]
for i in range(1,11):
if i in lst_included:
if i%2==0:
lst.append(i**2)
else
lst.append(i*2)
המימוש האלטרנטיבי עם List comprehension יראה כך
lst_included=[2,5,11,12]
[i**2 if i%2==0 else i*2 for i in range(1,11) if i in lst_included]
[4, 10]
שימו לב
התנאי הראשון במימוש המקורי (if i in lst_included) נועד לסנן על אילו איברים ברשימת הקלט נבצע את הפעולה יכללו ברשימה, והתנאי השני במימוש המקורי (if i%2==0: ... else:) קובע מה היה הערך שישמר ברשימת הפלט.
במימוש החדש, מכיוון שחלקי הביטוי הקשורים לערך החדש שיתווסף לרשימה יופיעו תחילה, אנו מתחילים כי הכתיבה של i**2 if i%2==0 else i*2 ולאחר מכן מופיעה פקודת הfor והif שאחראי על הסינון (if i in lst_included).
דוגמאות נוספות#
נגדיר רשימת המחרוזות הבאה:
l = ['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog']
כעת, נסו להבין, עבור כל דוגמא, מה היא אמורה לבצע.
לאחר מכן, נסו לשנות את הדוגמאות ולהתאימן לצרכים אחרים.
[word.upper() for word in l]
[word for word in l if len(word) < 4]
[i ** 2 if i % 3 == 0 else i ** 3 for i in range(2, 13) if i % 6 != 0]