רשימות מקוננות (nested lists)#
מבוא לרשימות מקוננות, או בשם אחר - “בעית ניו-זילנד 2”#
להלן רשימת הוצאות שבועיות לפי קטגוריה
קטגוריה |
שבוע 8 |
שבוע 7 |
שבוע 6 |
שבוע 5 |
שבוע 4 |
שבוע 3 |
שבוע 2 |
שבוע 1 |
|---|---|---|---|---|---|---|---|---|
אוכל |
664 |
169 |
89 |
252 |
659 |
353 |
272 |
80 |
לינה |
18 |
232 |
33 |
52 |
421 |
0 |
292 |
335 |
תחבורה |
30 |
18 |
32 |
226 |
181 |
1 |
115 |
605 |
מתנות |
3 |
131 |
446 |
20 |
39 |
0 |
221 |
180 |
וכרשימה מקוננת:
table = [
[80, 272, 353, 659, 252, 89, 169, 664], # אוכל
[335, 292, 0, 421, 52, 33, 232, 18], # לינה
[605, 115, 1, 181, 226, 32, 18, 30], # תחבורה
[180, 221, 0, 39, 20, 446, 131, 3] # מתנות
]
רשימות מקוננות הן רשימות שמכילות בתוכן רשימות נוספות.
בדרך כלל נשתמש במונח “רשימה חיצונית” כדי לתאר את הרשימה שמכילה את הרשימות, ואילו “רשימה פנימית” תהיה אחת מהרשימות שנמצאות בתוך הרשימה החיצונית.
הרשימה הפנימית יכולה להיות גם היא רשימה מקוננת, כלומר להכיל רשימות נוספות.
גם הרשימה הפנימית וגם הרשימה החיצונית הן רשימות לכל דבר ועניין - גם להן יש אורך (שניתן למצוא על-ידי שימוש בlen), וגם בהן ניתן לגשת לאיברים לפי אינדקסים באמצעות האופרטור [].
אינדקסים של רשימות מקוננות#
לנוחיותכם חלונית עם הקוד שראינו בסרטון. מוזמנים להריץ בעצמכם:
lst = [[4,5,3], [-77, "abc"]]
# print(len(lst))
# print(lst[0])
# print(lst[1])
# print(lst[0][0])
# print(lst[0][2])
inner_lst = lst[0]
# print(inner_lst[2])
# print(lst[0][2][0])
print(lst[1][1][0])
a
בסרטון זה למדנו כיצד לגשת לאיברים ברשימות מקוננות לפי אינדקס.
עבור הרשימה המקוננת L, ניתן לגשת לאינדקס הi על-ידי L[i]. מאחר שL[i] היא רשימה בעצמה (רשימה פנימית), ניתן לגשת לאינדקס הj של הרשימה הפנימית על ידי L[i][j].
דוגמא: עבור הרשימה [[3] ,[1,2]] = L.
הפקודה [0][1]L ניגשת תחילה לאיבר באינדקס 1 של L, כלומר, הרשימה [3].
לאחר מכן לאיבר באינדקס 0 של רשימה זו, כלומר, המספר 3.
בחנו את עצמכם
להלן רשימת ההוצאות השבועיות שראינו קודם
קטגוריה |
שבוע 8 |
שבוע 7 |
שבוע 6 |
שבוע 5 |
שבוע 4 |
שבוע 3 |
שבוע 2 |
שבוע 1 |
|---|---|---|---|---|---|---|---|---|
אוכל |
664 |
169 |
89 |
252 |
659 |
353 |
272 |
80 |
לינה |
18 |
232 |
33 |
52 |
421 |
0 |
292 |
335 |
תחבורה |
30 |
18 |
32 |
226 |
181 |
1 |
115 |
605 |
מתנות |
3 |
131 |
446 |
20 |
39 |
0 |
221 |
180 |
וכרשימה מקוננת:
table = [
[80, 272, 353, 659, 252, 89, 169, 664], # אוכל
[335, 292, 0, 421, 52, 33, 232, 18], # לינה
[605, 115, 1, 181, 226, 32, 18, 30], # תחבורה
[180, 221, 0, 39, 20, 446, 131, 3] # מתנות
]
להלן הרשימה הבאה:
L = [1, [2], [“a”, “list”] ]
פעולות על רשימות מקוננות#
לנוחיותכם חלונית עם הקוד שראינו בסרטון. מוזמנים להריץ בעצמכם:
table = [[4, 7, 8, 9],
[6, 0, -3, 1],
[12, 3, 4, 2]]
# print(len(table[1]))
# print(sum(table[0]))
s0 = sum(table[0])
s1 = sum(table[1])
s2 = sum(table[2])
# print(s0 + s1 + s2)
sums_lst = [s0, s1, s2]
print(sum(sums_lst))
53
בחנו את עצמכם
לפניכם מופיעות מספר שאלות. השאלות מתייחסות למשתנים הבאים:
T = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
i=0
j=1
שימו לב - הרשימה T היא רשימה מקוננת.
בכל שאלה תופיע פקודה מסוימת המערבת את המשתנים הנ”ל. עליכם לסמן מהו הערך המוחזר מהפקודה, או לסמן כי הפקודה מביאה לשגיאה.
דוגמאות:
הפקודה
len(T)מחזירה 3 - שכן הרשימהTמחזיקה בתוכה 3 רשימות (מקוננות).הפקודה
T[0][3]מביאה לשגיאה, שכן לרשימה שנמצאת באינדקס 0 (ביחס ל-T) יש 3 איברים, ולכן לא ניתן לגשת ברשימה (מקוננת) זו לאיבר באינדקס 3.
לנוחותכם, יצרנו חלונית קוד בה תוכלו לבדוק את עצמכם ולהשתכנע בנכונות התשובות. אנו ממליצים לענות תחילה על כל השאלות ולאחר מכן לבדוק את עצמכם בחלונית הקוד.
על מנת להציג את הערך המוחזר של פקודה מסוימת, “עטפו” אותה בפקודת print. למשל: print(len(T))
T = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
i = 0
j = 1
# check your answers here:
בחנו את עצמכם#
בחלונית הקוד למטה מופיע המשתנה
table. משתנה זה הוא טבלת מספרים (רשימה של רשימות). בטבלה 3 שורות (רשימות), ובכל שורה 5 איברים.
עליכם לממש את הפונקציהtable_statisticsאשר מקבלת את המשתנהtable, ומחזירה את המשתניםtable_sum,table_min,table_max,sorted_tableלפי הערכים הבאים.
המשתנהtable_sumיחזיק את סכום המספרים בטבלה.
המשתנהtable_minיחזיק את ערכו של האיבר המינימלי בטבלה.
המשתנהtable_maxיחזיק את ערכו של האיבר המקסימלי בטבלה.
המשתנהsorted_tableיחזיק רשימה (לא מקוננת) ובה כל המספרים שבטבלה ממוינים מהקטן לגדול.
הנחיות: היעזרו בפונקציות המובנות של פייתון -sum,min,max,sorted. היעזרו בסרטון שזה עתה ראיתם - למעשה, פתרנו בו חלק מהתרגיל.
def table_statistics(table):
# Write your code here
return table_sum, table_min, table_max, sorted_table
לאחר שפתרתם את התרגיל - הריצו את הקוד וצפו בתוצאות הפלט - תקנו את הקוד במידת הצורך.
table = [ [6, 9, -18, 12, 21],
[5, 20, 0, 4, 16],
[-6, 5, -12, -6, -13]]
table_sum, table_min, table_max, sorted_table = table_statistics(table)
print("table_sum: ", table_sum, "\ntable_min: ", table_min, "\ntable_max: ", table_max, "\nsorted_table: ", sorted_table)
רמזים
כדי למצוא את סכום המספרים בטבלה, ניתן לחשב בנפרד את סכום כל שורה בטבלה, ולחבר את סכומים אלו.
כדי למצוא את האיבר המינימלי בטבלה, ניתן לחשב בנפרד את האיבר המינימלי של כל שורה, ולבצע חישוב נוסף שימצא את המינימלי מבין איברים אלו (שהוא, כמובן, האיבר המינימלי בטבלה).
חישוב האיבר המקסימלי בטבלה יעשה באופן דומה לחישוב האיבר המינימלי.
כדי ליצור רשימה ממוינת של כל המספרים שבטבלה, מומלץ בהתחלה ליצור רשימה של כל המספרים בטבלה ע”י שרשור שורות הטבלה.
כעת אתם מוכנים לעזור לבני לקצץ בהוצאות!
להלן רשימת ההוצאות השבועיות שראינו קודם:
קטגוריה |
שבוע 8 |
שבוע 7 |
שבוע 6 |
שבוע 5 |
שבוע 4 |
שבוע 3 |
שבוע 2 |
שבוע 1 |
|---|---|---|---|---|---|---|---|---|
אוכל |
664 |
169 |
89 |
252 |
659 |
353 |
272 |
80 |
לינה |
18 |
232 |
33 |
52 |
421 |
0 |
292 |
335 |
תחבורה |
30 |
18 |
32 |
226 |
181 |
1 |
115 |
605 |
מתנות |
3 |
131 |
446 |
20 |
39 |
0 |
221 |
180 |
וכרשימה מקוננת:
table = [
[80, 272, 353, 659, 252, 89, 169, 664], # אוכל
[335, 292, 0, 421, 52, 33, 232, 18], # לינה
[605, 115, 1, 181, 226, 32, 18, 30], # תחבורה
[180, 221, 0, 39, 20, 446, 131, 3] # מתנות
]
ממשו פונקציה בשם most_expensive(table) אשר מקבלת רשימה מקוננת באורך 4 (לפי הסדר - אוכל, לינה, תחבורה ומתנות).
הפונקציה בודקת את הסכום של כל אחת מהקטגוריות, לאורך השבועות.
אם ההוצאה היקרה ביותר היא אוכל, הפונקציה תחזיר את המחרוזת "food".
אם ההוצאה היקרה ביותר היא לינה, הפונקציה תחזיר את המחרוזת "stay".
אם ההוצאה היקרה ביותר היא תחבורה, הפונקציה תחזיר את המחרוזת "transport".
אם ההוצאה היקרה ביותר היא מתנות, הפונקציה תחזיר את המחרוזת "gifts".
# Write your code here
table = [
[80, 272, 353, 659, 252, 89, 169, 664], # אוכל
[335, 292, 0, 421, 52, 33, 232, 18], # לינה
[605, 115, 1, 181, 226, 32, 18, 30], # תחבורה
[180, 221, 0, 39, 20, 446, 131, 3] # מתנות
]
print(most_expensive(table))