Dalszy ciąg o listach w Pythonie (pierwszą część znajdziesz tutaj ⏏️) 🎉! Dzisiaj pokażę Ci czym w języku Python charakteryzuje się lista dwuwymiarowa, jak ją utworzyć, do jakich celów można ją zastosować oraz jak przedostawać się do poszczególnych jej elementów 🔍. Postaram się wyłożyć cały temat w łatwo zrozumiały sposób 😉. Zapraszam 😁!
TŁUMACZĘ NA CZYM POLEGA LISTA DWUWYMIAROWA W JĘZYKU PYTHON!
Uprzedzam, że tu może być Ci potrzebna dużo dłuższa chwila na pojęcie tematu, gdyż trzeba go dobrze zrozumieć i abstrakcyjnie, i praktycznie 😨. Rozpoczniemy od samego pojęcia i przeanalizowania go abstrakcyjnie z dwóch różnych perspektyw 1️⃣. Następnie przejdziemy do już bezpośrednio do kodu źródłowego 2️⃣, aż wreszcie zostanie ukazany prosty przykład użycia 3️⃣.
Zaczynajmy, sporo punktów przed nami 😅!
CZYM JEST LISTA DWUWYMIAROWA W JĘZYKU PYTHON?
W Pythonie, lista dwuwymiarowa to w rzeczywistości taka sama lista, jak ta "zwykła". Różnica tkwi w typie elementów 🔥. Zamiast liczb czy łańcuchów znaków, elementy są listami 😮! Tym się charakteryzują listy dwuwymiarowe 🧨!
Aby wytłumaczyć tak prosto, jak się da, przedstawię 2 perspektywy: łatwiejszą do wyobrażenia sobie i zgodną z budową strukturalną 🚀!
Opisuję perspektywę łatwiejszą do zrozumienia 👀.
SPOJRZENIE NA LISTĘ DWUWYMIAROWĄ W JĘZYKU PYTHON JAK NA SIATKĘ
Jak tworzysz sobie listę, to to jest lista jednowymiarowa - przyjmijmy takie nazewnictwo, aby było łatwiej porównywać 😉. Gdy poruszasz się po elementach takiej listy (według notacji indeksowej), to można powiedzieć, że posiadasz jeden wymiar ↔️. To tak samo, jak z półkami przymocowanymi do ściany 🙂. Gdy kładziesz na niej przedmioty, to układasz je poziomo obok siebie, czyli poruszasz się w jednym wymiarze 💡. Masz jeden wiersz i wiele kolumn.
A teraz uważaj 🔔. Gdy do listy jednowymiarowej wprowadzasz element w postaci nowej listy, dodajesz kolejny wymiar do poruszania się 💥! Gdy odwołujesz się do elementu listy tak samo jak wcześniej, to wówczas uzyskujesz dostęp do listy "wewnętrznej" (pozwolę sobie na taki skrót myślowy 🙂). W ten sposób, lista dwuwymiarowa może być przez nas postrzegana dosłownie przez pryzmat układu współrzędnych 💡! Najpierw poruszasz się po osi X i to jest lista z listą w środku 😅, a później po osi Y i wtedy sięgamy do listy wewnętrznej 😊. Każde zagnieżdżenie tworzy kolejny wymiar, co dodaje wiarygodności takiemu patrzeniu na strukturę 👍.
Takie myślenie jest intuicyjne i łatwe do zrozumienia ✅.
![]() |
Lista dwuwymiarowa w języku Python jest łatwa do zrozumienia przez patrzenie na nią jak na planszę, na której znajdują się pola o określonych pozycjach w osi X oraz Y. Najpierw odwołujemy się do wiersza, a później do kolumny.
To teraz drugie spojrzenie na ten wątek 🧐. Ono jest zgodne z rzeczywistością ⚠️!
SPOJRZENIE NA LISTĘ DWUWYMIAROWĄ W JĘZYKU PYTHON JAK NA LISTY ZAGNIEŻDŻONE
Tak naprawdę, to nie ma listy dwuwymiarowej 😮. Występuje lista zagnieżdżona, ponieważ jedna lista jest wstawiana wewnątrz innej i tak dosłownie piszemy w kodzie 💥! Czyli patrząc z perspektywy struktury danych, to nie ma "wymiarów" listy, tylko lista zawierająca w sobie zagnieżdżone inne listy, czyli lista list 😅! Porównując to znowu do mebli, to przypominałoby szufladki biurka 😊. Listą "zewnętrzną" jest samo biurko, bo zawiera w sobie wszystkie elementy, a jeżeli odwołujesz się do listy wewnętrznej, to tak jakbyś otwierał(a) jedną z szufladek, a każda z nich także może zawierać w sobie inne elementy 🤩!
To jest bardziej zbliżone do prawdy, ponieważ listy zagnieżdżone wcale nie muszą przyjmować tego samego rozmiaru, co lista "zewnętrzna" (każda szuflada może mieć inną liczbę elementów) ⚠️! Wniosek z tego jest taki, że lista dwuwymiarowa to w rzeczywistości lista zawierająca elementy w postaci zagnieżdżonych list ☑️.
![]() |
Lista dwuwymiarowa w języku Python, to w rzeczywistości lista list, czyli lista zawierająca elementy w postaci odrębnych list, a każda nich może dysponować własnym rozmiarem!
Mamy za sobą wyjaśnienie teoretyczne i to z dwóch różnych perspektyw 🧡. Przechodzimy teraz do budowy listy dwuwymiarowej w kodzie źródłowym ⭐!
JAK UTWORZYĆ LISTĘ DWUWYMIAROWĄ W JĘZYKU PYTHON?
Lista dwuwymiarowa w Pythonie tworzona jest nieco inaczej niż każda inna, więc pokażę najpierw jak wygląda najprostsza forma, czyli gdy obie listy są puste 👇:
my_2d_list = [[]]Te same nawiasy kwadratowe, a wewnątrz nich kolejna para nawiasów kwadratowych 🔥! To oznacza listę, która posiada w sobie osobną listę - dosłownie 😁.
A teraz przypadek, gdy lista zagnieżdżona ma zawierać elementy 👇:
my_2d_list = [[1, 2, 3]]To jest lista zawierająca w sobie jedną listę, a ona składa się z 3 liczb całkowitych (bez ułamka) 😊.
No to teraz sytuacja, w której lista posiada wiele list, a każda z nich ma własne elementy 😁. Popatrz na to 👇:
my_2d_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]Oto lista zawierająca w sobie 3 listy, a każda z nich posiada własne 3 liczby całkowite 😮!
Zaznaczam w tym miejscu, że każda z list zagnieżdżonych może mieć różne rozmiary, na przykład 👇:
my_2d_list = [[1, 2, 3], [4, 5], [6]]Lista zawierająca w sobie 3 listy, a wewnątrz 👇:
- pierwsza lista składa się z 3 liczb całkowitych,
- druga lista posiada 2 liczby całkowite,
- trzecia lista zawiera tylko jedną liczbę całkowitą.
Jest to sytuacja jak najbardziej poprawna ✅. Czasami możesz natrafić na pojęcie "tablicy postrzępionej" (ang. jagged array), lecz w tym przypadku raczej "listy postrzępionej". To jest taka lista, w której listy wewnętrzne posiadają różne rozmiary ℹ️.
Lista dwuwymiarowa w języku Python posiada w sobie elementy będące odrębnymi listami, a każda z nich może posiadać własne indywidualne elementy i być innego rozmiaru!
Tak wygląda tworzenie listy dwuwymiarowej. W jej przypadku zdecydowanie częściej będziesz w sytuacji wypełnienia jej danymi przez pętle, niż wpisywania wartości w miejscu jej tworzenia i wtedy obsługa jest nieco trudniejsza, lecz to pokażę dopiero na konkretnym przykładzie. Teraz przejdziemy do tego, jak się odwoływać do elementów list listy 😉!
JAK POBIERAĆ ELEMENTY Z LISTY DWUWYMIAROWEJ W JĘZYKU PYTHON?
Pobieranie elementów z listy dwuwymiarowej jest bardziej podchwytliwe, ponieważ trzeba pamiętać o prawidłowej kolejności przedostawania się do struktur danych 😨. Jeżeli mamy taką listę 👇:
my_2d_list = [[1, 2, 3]]to aby pobrać pierwszy element listy zagnieżdżonej, musisz najpierw odwołać się do samej listy i potem dopiero do jej elementu 😱! W praktyce oznacza to następujący zapis 👇:
print(my_2d_list[0][0])Wtedy ujrzymy na wyjściu wartość 1 👍. Jak już zapewne wiesz, uo 👇:
print(my_2d_list[0])oznacza pobranie pierwszego elementu listy 1️⃣. Natomiast w tym przypadku, tym elementem będzie cała lista zagnieżdżona 😮! Dlatego też musimy zawrzeć podwójną notację indeksową! Czyli za pierwszym razem odwołujemy się do listy, a za drugim razem, do jej elementów 💡.
Wszelkie inne kombinacje związane z odwoływaniem się do elementów, które pokazałem w artykule wprowadzającym do samych list, obejmują również listy dwuwymiarowe, więc nie ma co opisywać każdego przypadku i najlepiej samemu sobie poćwiczyć korzystanie z nich ℹ️. Najważniejsze dla Ciebie, to mieć z tyłu głowy to, że listy zagnieżdżone wymagają prawidłowego "wskazania", tak jak przy przechodzeniu przez kolejne foldery w systemie 📂.
Zamykam ten wątek i przechodzę do ukazania konkretnego przykładu 🚀!
PRZYKŁAD UŻYCIA LISTY DWUWYMIAROWEJ W JĘZYKU PYTHON
Wyobraź sobie, że chcesz stworzyć tabliczkę mnożenia dla dowolnej maksymalnej liczby ✖️. Po wprowadzeniu dowolnej liczby całkowitej (bez ułamka) większej od zera, program prawidłowo buduje strukturę dla dwuwymiarowej planszy, przypisuje w każdej kratce odpowiednią liczbę i wypisuje całość na konsolę.
Mając wiedzę o użyciu listy dwuwymiarowej, tak może wyglądać przykładowy kod 👇:
grid = []
maximum_number = 10
numbers_range = range(maximum_number)
for row_index in numbers_range:
grid.append([])
print('[', end = '')
for column_index in numbers_range:
row = row_index + 1
column = column_index + 1
grid[row_index].append(row*column)
print(str(grid[row_index][column_index]), end = ', ' if column < maximum_number else '')
print(']')Dane wejściowe są takie. Tworzymy sobie listę dla tabliczki mnożenia 🙂. Na razie bez żadnych list wewnątrz, to ustalamy w obrębie pętli "for" ℹ️. Dalej mamy liczbę całkowitą (bez ułamka) do określenia do której maksymalnie liczby chcemy mieć zrobioną tabliczkę. Liczba 10 będzie oznaczać utworzenie planszy 10x10, a więc liczby od 1 do 100 ❤️. Ostatnia ze zmiennych dotyczy zakresu ("range") dla przedziału liczbowego od 0 (zero) do N - 1, który będzie idealnie pasować do odwoływania się do elementów list zagnieżdżonych ✅!
Teraz mamy pętlę "for", a w zasadzie dwie 🔥! Zwróć uwagę na nazwy zmiennych osadzonych w nagłówkach pętli: rząd i kolumna! Lista dwuwymiarowa to tak naprawdę lista zawierająca listy zagnieżdżone, natomiast do nas bardziej przemawia spojrzenie jak na układ współrzędnych, więc często stosuje się takie nazewnictwo i to jest OK 👍. Teraz popatrzmy na instrukcje w obu pętlach 🔍.
Pierwsza pętla "for" służy do obsługi każdego z wierszy. Powiedzieliśmy sobie, że aby dostać się do elementów listy zagnieżdżonej, musimy w pierwszej kolejności odwołać się do samej listy 💡. Najpierw dodajemy sobie listę do listy "głównej" używając metody "append". To będzie nasz ten "drugi wymiar" 😊. Niżej mamy wywołanie funkcji "print", aby oznaczyć sobie w konsoli rozpoczęcie wypisywania wiersza (czy też rzędu) ✅. Aby nie doprowadzić do przejścia do nowego wiersza, dopisujemy dodatkowy argument "end", któremu przypisujemy pusty łańcuch znaków 💥.
W dalszym ciągu mamy drugą pętlę "for" i to jest ciekawy moment 👀! W tym miejscu dochodzi do obsługi każdej kolumny, czyli po przedostaniu się do listy zagnieżdżonej, tutaj operujemy już na jej elementach, którymi będą odpowiednie liczby 🎉! Aby mieć pewność, że każda komórka zostanie uwzględniona, liczba pętli "for" musi się zgadzać z liczbą "wymiarów" listy, czy inaczej, z naszym "wchodzeniem" do zagnieżdżonych list 💥! Każda siatka składa się z iloczynu wierszy i kolumn, więc jedna pętla musi znajdować się w drugiej i tak postępujemy zawsze 💡.
Akurat w przypadku tabliczki mnożenia oba wymiary są identyczne, więc w obu pętlach możemy skorzystać z tego samego zakresu, natomiast warto pamiętać, że jeżeli kiedykolwiek staniesz przed sytuacją, w której siatka może być prostokątna (liczba wierszy różna od liczby kolumn), wtedy musisz dopasować odpowiednie zakresy osobno dla pętli zewnętrznej i osobno dla wewnętrznej 😱!
W środku pętli wewnętrznej, na początku są 2 zmienne do przechowywania aktualnego wiersza i kolumny ℹ️. W pętlach "for" operujemy na zakresach z przedziału od 0 do N - 1, gdyż tak jest dostosowane pod notację indeksową elementów ⚠️. Aby do tabliczki mnożenia trafiły prawidłowe liczby, podnosimy wartości indeksów o 1 do góry ⬆️.
Dalej mamy ponowne wywołanie metody "append", lecz teraz to dotyczy dodania liczby do listy zagnieżdżonej 😱! Wcześniej dodawaliśmy listę zagnieżdżoną do listy zewnętrznej, a tutaj dodajemy liczbę do listy zagnieżdżonej 🔥! Chcę, abyś wyraźnie widział(a) tę różnicę 👀! Aby otrzymać odpowiednią liczbę zgodnie z tabliczką mnożenia, elementem musi być wynik mnożenia aktualnego wiersza i kolumny ✔️. A na samym końcu mamy kolejne wywołanie funkcji "print", które jest dużo bardziej rozbudowane, niż poprzednie, więc parę zdań więcej o nim 📣.
Chcemy wypisać konkretną liczbę z danej komórki (czyli elementu X-tej listy zagnieżdżonej listy zewnętrznej 😅), więc odwołujemy się do niego najpierw poprzez listę zagnieżdżoną, a potem jej element 🙂. Również i tutaj określamy jaki łańcuch ma wystąpić na końcu, lecz tym razem uzależniamy to od tego, czy doszliśmy do ostatniej liczby w wierszu 😮! Ten fragment 👇:
end = ', ' if column < maximum_number else ''oznacza w wolnym tłumaczeniu: "przypisz przecinek ze spacją, jeśli to nie jest ostatnia kolumna, a w przeciwnym razie przypisz pusty łańcuch" 🧨. Wtedy w konsoli ujrzymy prawidłowy zapis wartości w danym wierszu ✅. To jest koniec pętli wewnętrznej dla obsługi kolumn (liczb) 🏁.
Już poza pętlą wewnętrzną, na samym końcu mamy trzecie wywołanie funkcji "print", w którym tylko wstawiamy oznaczenie końca pojedynczego wiersza. To jest koniec pętli zewnętrznej dla obsługi wierszy (list zagnieżdżonych) 🏁.
Po uruchomieniu tego programu, Twoim oczom ukaże się ładnie sformatowana tabliczka mnożenia wraz z oznaczeniami początku i końca 🏆!
Tak wygląda całe zagadnienie 🙂. Ono wymaga wyłapania kluczowych miejsc w kodzie, lecz jeżeli w pełni zrozumiesz obsługę dla listy dwuwymiarowej, to wtedy zrozumiesz jak obsługiwać listy o większej liczbie wymiarów 🤩!
Koniec tematu 😎. Mam nadzieję, że udało się jakoś przybliżyć temat z kilku różnych punktów widzenia 😊.

