לוח של איקס עיגול, גיליון ציונים, מפה במשחק: כולם טבלאות. בפייתון טבלה היא רשימה של רשימות. כל רשימה פנימית היא שורה, ו-grid[r][c] הוא התא בשורה r ובעמודה c. כאן ניגשים לתאים, עוברים על הטבלה בלולאה כפולה ומחשבים סכומים. כדאי להכיר קודם רשימות ולולאות. גם מילונים עוזרים לשמור מידע על לוח.
grid = [
[3, 1, 4], # row 0
[1, 5, 9], # row 1
]
print(grid[1]) # [1, 5, 9]
print(grid[1][2]) # 9
print(len(grid), len(grid[0])) # 2 3
grid[1] הוא שורה שלמה: רשימה. grid[1][2] לוקח מהשורה הזו את המקום 2. גם השורות וגם העמודות מתחילות מ-0.
len(grid) הוא מספר השורות. len(grid[0]) הוא מספר העמודות, כלומר האורך של שורה אחת.
הלולאה החיצונית עוברת על השורות, והפנימית על התאים בכל שורה. בטבלה של 3 שורות ו-4 עמודות, השורה הפנימית רצה 3 כפול 4, כלומר 12 פעמים.
grid[row][col], שורה ראשונה ועמודה שנייה. השורה האחרונה היא len(grid) - 1, לא len(grid).בחרו גודל לטבלה ותא מטרה. התוכנית מדפיסה את תא המטרה, מחשבת סכום לכל שורה בלולאה כפולה, ואז סכום של עמודת המטרה. לחצו "שורה הבאה": התא שהתוכנית קוראת עכשיו נצבע בצהוב.
נסו את אלה:
צהוב: התא שנקרא עכשיו · מסגרת כחולה: תא המטרה grid[r][c] · בצד: סכומי השורות שכבר חושבו
אפשר לשנות את הקוד ולהריץ פייתון אמיתי. בפעם הראשונה הטעינה לוקחת כמה שניות.
הסדר הוא תמיד שורה ואז עמודה. בטבלה של 2 שורות ו-3 עמודות, grid[2][1] כבר מחוץ לטבלה.
grid = [[3, 1, 4], [1, 5, 9]]
print(grid[2][1])
✓ שורה 1, עמודה 2: 9grid = [[3, 1, 4], [1, 5, 9]]
print(grid[1][2])
יש len(grid) שורות, ממוספרות מ-0. לכן range(len(grid)) מספיק בדיוק. עוד 1 יוצא מהטבלה.
for i in range(len(grid) + 1):
print(grid[i])
✓ נכוןfor i in range(len(grid)):
print(grid[i])
[[0] * 3] * 2 לא יוצר שתי שורות. הוא יוצר שורה אחת, ושני שמות שמצביעים עליה. שינוי אחד משנה "את שתיהן".
g = [[0] * 3] * 2
g[0][0] = 5
print(g)
✓ [[5, 0, 0], [0, 0, 0]]g = [[0] * 3 for i in range(2)]
g[0][0] = 5
print(g)
לסכום של כל שורה, מאפסים את s בתוך הלולאה החיצונית, לפני הפנימית. אם מאפסים פעם אחת בחוץ, כל "סכום שורה" כולל גם את השורות שלפניה.
s = 0
for row in grid:
for x in row:
s = s + x
print(s)
✓ סכום לכל שורהfor row in grid:
s = 0
for x in row:
s = s + x
print(s)
הלוח הוא 3 שורות של 3 תאים. התוכנית שמה O בתא אחד, מדפיסה את הלוח שורה אחרי שורה, ובודקת אם יש ל-X אלכסון מלא.
רשימה שכל איבר בה הוא רשימה בעצמו. כל רשימה פנימית היא שורה, וביחד הן טבלה. ניגשים לתא עם שני אינדקסים: grid[שורה][עמודה]. נסו במעבדה.
עמודה היא לא רשימה אחת, אלא תא אחד מכל שורה. לכן עוברים על השורות ומוסיפים מכל אחת את התא באותה עמודה: col_sum = col_sum + grid[i][c].
מספר השורות כפול מספר העמודות. בטבלה של 10 על 10 זה 100 פעמים, ובלוח של 1000 על 1000 זה מיליון. בגלל זה לולאה כפולה היא דוגמה ל-O(n²) בסיבוכיות. תרגלו למטה.