enumerate ו-zip – כלים שימושיים ללולאות
- Feb 4, 2019
- 2 min read
enumerate ו-zip – כלים שימושיים ללולאות
כשעובדים עם לולאות בפייתון, יש שתי פונקציות מובנות שחוסכות המון קוד ועושות את החיים קלים יותר – enumerate ו-zip. אחרי שמכירים אותן, אי אפשר בלעדיהן.
enumerate – מספור אוטומטי בלולאות
נניח שיש לנו רשימה של פירות ואנחנו רוצים להדפיס כל פרי עם המספר שלו. בלי enumerate היינו צריכים לעשות משהו כזה –
fruits = ["תפוח", "בננה", "תפוז", "אבטיח"] i = 0 for fruit in fruits: print(f"{i}: {fruit}") i += 1
>>>
0: תפוח
1: בננה
2: תפוז
3: אבטיח
זה עובד, אבל המונה i מסרבל את הקוד. עם enumerate נקבל בדיוק את אותה תוצאה בצורה נקייה הרבה יותר –
fruits = ["תפוח", "בננה", "תפוז", "אבטיח"] for i, fruit in enumerate(fruits): print(f"{i}: {fruit}")
>>>
0: תפוח
1: בננה
2: תפוז
3: אבטיח
הפונקציה enumerate עוטפת את הרשימה ומחזירה בכל סיבוב של הלולאה זוג – אינדקס וערך. האינדקס נכנס ל-i והערך נכנס ל-fruit.
אם רוצים שהמספור יתחיל ממספר אחר (למשל מ-1 במקום מ-0) אפשר להעביר פרמטר start –
for i, fruit in enumerate(fruits, start=1): print(f"{i}. {fruit}")
>>>
1. תפוח
2. בננה
3. תפוז
4. אבטיח
zip – לולאה מקבילת על כמה רשימות
נניח שיש לנו שתי רשימות – שמות תלמידים והציונים שלהם – ואנחנו רוצים להדפיס כל תלמיד עם הציון שלו. בלי zip היינו צריכים לעבוד עם אינדקסים –
names = ["דנא", "יוסי", "מיכל"] grades = [92, 85, 97] for i in range(len(names)): print(f"{names[i]} קיבל/ה {grades[i]}")
>>>
דנא קיבל/ה 92
יוסי קיבל/ה 85
מיכל קיבל/ה 97
עם zip זה הרבה יותר אלגנטי –
names = ["דנא", "יוסי", "מיכל"] grades = [92, 85, 97] for name, grade in zip(names, grades): print(f"{name} קיבל/ה {grade}")
>>>
דנא קיבל/ה 92
יוסי קיבל/ה 85
מיכל קיבל/ה 97
הפונקציה zip לוקחת שתי רשימות (או יותר) וצועדת עליהן במקביל – בכל סיבוב של הלולאה היא שולפת איבר אחד מכל רשימה ונותנת אותם יחד.
אפשר לעשות zip גם על שלוש רשימות ויותר –
names = ["דנא", "יוסי", "מיכל"] grades = [92, 85, 97] cities = ["תל אביב", "חיפה", "ירושלים"] for name, grade, city in zip(names, grades, cities): print(f"{name} מ{city} – ציון {grade}")
>>>
דנא מתל אביב – ציון 92
יוסי מחיפה – ציון 85
מיכל מירושלים – ציון 97
חשוב לדעת – אם הרשימות לא באותו אורך, zip עוצרת כשהרשימה הקצרה ביותר נגמרת –
a = [1, 2, 3, 4, 5]
b = ["א", "ב", "ג"]
print(list(zip(a, b)))
>>>
[(1, "א"), (2, "ב"), (3, "ג")]
שילוב enumerate ו-zip – אפשר גם לשלב את שתי הפונקציות ביחד כשרוצים גם מספור וגם מעבר מקבילי –
names = ["דנא", "יוסי", "מיכל"] grades = [92, 85, 97] for i, (name, grade) in enumerate(zip(names, grades), start=1): print(f"{i}. {name}: {grade}")
>>>
1. דנא: 92
2. יוסי: 85
3. מיכל: 97
שימוש מעשי – יצירת מילון מזוגות של רשימות –
keys = ["name", "age", "city"]
values = ["Eddie", 40, "Tel Aviv"]
d = dict(zip(keys, values))
print(d)
>>>
{'name': 'Eddie', 'age': 40, 'city': 'Tel Aviv'}
לסיכום – enumerate חוסכת את הצורך לנהל מונה ידני כשרוצים לדעת את האינדקס בלולאה, ו-zip מאפשרת לעבור על כמה רשימות במקביל בלי להתעסק עם אינדקסים. שתי הפונקציות האלה הופכות את הקוד לנקי וקריא יותר, ומומלץ להשתמש בהן בכל הזדמנות.
Comments