Przeczytaj
Tablice dwuwymiarowe: definiowanie macierzy i operacje na ich elementach
Załóżmy, że gramy w statki. Pusta plansza do gry w statki liczy 100 pól.
Wypełniliśmy już swoją planszę, zaznaczając na niej nasze okręty.
Część pól dalej jest pusta, część została zaczerniona (znajdują się na nich okręty). Łatwo sprawdzić, czy dane pole zawiera statek czy nie – nazwa pola składa się z litery i liczby, np. A6.
Plansza składa się z kolumn oraz wierszy. Możemy stwierdzić, że składa się z kilku tablic (uporządkowanych zbiorów elementów tego samego typu) – jest tablicą tablic, czyli tablicą, które elementami są inne tablice.
W języku Python struktury danych, którymi są tablice, będziemy implementować za pomocą list. W naszym przypadku będzie to lista wielowymiarowalista wielowymiarowa.
W tym e‑materiale mówiąc o tablicach, mamy na myśli strukturę danych, która w języku Python implementowana jest za pomocą listy.
Pamiętaj, że w przypadku tablic wszystkie elementy muszą być tego samego typu, natomiast w przypadku list takie ograniczenie już nie obowiązuje. Więcej informacji na temat tablic i list znajdziesz w e‑materiałach:
Podstawowe struktury danych: tablicaPodstawowe struktury danych: tablica,
Tablice jednowymiarowe w języku PythonTablice jednowymiarowe w języku Python,
Tablice wielowymiaroweTablice wielowymiarowe.
Aby utworzyć tablicę wielowymiarową w języku Python, możemy posłużyć się zapisem:
Ma ona trzy elementy - każdy z nich jest kolejną tablicą, która również zawiera trzy elementy. Warto jednak podkreślić, że każda z tablic mogłaby mieć dowolną długość.
Zauważmy, że na końcu wiersza numer 3 znajduje się przecinek, pomimo braku kolejnego elementu. Jest to poprawny zapis w języku Python. Dzięki takiej notacji, rozbudowując program, możemy łatwo dodawać kolejne wiersze w tablicy.
Naszą planszę do gry w statki możemy przechować w programie w następujący sposób:
Tablicę możemy wypełnić danymi w różny sposób, m.in. przez:
przypisanie wartości na etapie jej inicjowania,
utworzenie nowej tablicy na podstawie innej tablicy za pomocą wyrażeń indeksującychwyrażeń indeksujących,
wykorzystanie generatora,
wstawianie elementów do tablicy, np. podanych przez użytkownika wyników obliczeń.
Odwołując się do konkretnego elementu w przypadku tablic dwuwymiarowych, podajemy dwa indeksy w sąsiadujących nawiasach kwadratowych. Przykładowo, zapis tablica_glowna[i][j]
oznacza element o indeksie j
w tablicy, która jest i‑tym
elementem tablicy tablica_glowna
.
Oto przykład zdefiniowania tablicy wielowymiarowej i sposób przywoływania jej elementu:
Jeżeli odwołamy się do elementu tablicy dwuwymiarowej, podając tylko jeden indeks, otrzymamy tablicę jednowymiarową (która jest elementem tablicy dwuwymiarowej). Podanie indeksu wykraczającego poza zakres dowolnej tablicy kończy się wyświetleniem komunikatu o błędzie: IndexError: list index out of range
.
Pamiętajmy, że w języku Pyton występują ujemne indeksy, które wskazują na elementy tablicy, patrząc od jej prawej strony (od tyłu).
Wartości poszczególnych elementów możemy modyfikować w prosty sposób – przez przypisanie. Oto przykład takiej operacji:
Przeanalizujmy inny przypadek: z dwóch tablic jednowymiarowych o takiej samej liczbie elementów zbudujemy trzecią — dwuwymiarową. Zrobimy to na dwa sposoby:
przez proste przypisanie tablic jako elementów,
przez przypisanie kopii tablic jako elementów dzięki mechanizmowi wyrażeń indeksujących (
slice
).
Funkcja del()
kasuje nieodwracalnie wskazane indeksem elementy bądź całą strukturę. Więcej na jej temat można przeczytać w dokumentacji języka Python 3.3.
Do dyspozycji mamy też metody:
pop(index)
– zwraca wartość elementu o numerzeindex
i kasuje ten obiekt,remove(wartość)
– kasuje pierwszy element o podanej wartości.
Napiszmy program, który wypisze na ekranie tabliczkę mnożenia dla czynników z przedziału prawostronnie otwartego od poczatkowy
do koncowy
. Przyjmiemy założenie, że liczba elementów w wierszu i w kolumnie będzie identyczna:
Specyfikacja problemu:
Dane:
poczatkowy
– początek przedziałukoncowy
– koniec przedziału
Wynik:
Program wypisuje na ekran tabliczkę mnożenia dla czynników z przedziału prawostronnie otwartego od poczatkowy
do koncowy
.
Rezultat działania funkcji wygląda następująco:
Do operowania na elementach listy lub tablicy możemy wykorzystać też funkcję enumerate(iteriter)
, która zwraca obiekt typu tuple
(indeks oraz wartość danego elementu), na przykład:
Operacje na macierzach
Tablice dwuwymiarowe mogą posłużyć do przeprowadzania operacji na macierzachmacierzach.
Napiszmy funkcję obliczającą sumę dwóch macierzy, pamiętając, że możemy dodawać tylko macierze o tych samych wymiarach.
Działanie programu przetestujemy dla macierzy:
Specyfikacja problemu:
Dane:
A
- składnik dodawania; macierz kwadratowa rozmiarun
n
B
- składnik dodawania; macierz kwadratowa rozmiarun
n
Wyniki:
C
- wynik dodawania macierzy ; macierz kwadratowa rozmiarun
n
Oto dwie macierze (tablice/listy dwuwymiarowe):
Macierz A
Którą w kodzie możemy zapisać jako:
Macierz B
Którą w kodzie możemy zapisać jako:
Macierz C
Operacja dodawania dwóch macierzy polega na dodawaniu elementów o takich samych indeksach, czyli C[i][j] = A[i][j] + B[i][j]
.
Którą w kodzie możemy zapisać jako:
Korzystając z takiej definicji, możemy zapisać funkcję w języku Python:
Wynikiem jej działania jest macierz C
będąca wynikiem operacji dodawania macierzy
Co w sytuacji, kiedy do czynienia mamy z macierzą prostokątną o wymiarach n
m
? Zapoznaj się z implementacją.
Przykłady operacji na tablicach n‑wymiarowych
W języku Python nie ma ograniczeń w stosunku do liczby zagnieżdżonych tablic. Możemy z łatwością stworzyć tablicę trójwymiarową.
Oto przykład tablicy z trzema wymiarami, czyli tablicy zagnieżdżonej w tablicy, która jest zagnieżdżona w kolejnej tablicy:
Możemy również wykorzystać pętle, aby pokazać kolejne zagnieżdżenia:
Istnieje moduł o nazwie NumPy
– umożliwia on wykonywanie operacji na tablicach liczb.
Słownik
lista złożona z elementów będących listami; w języku Python nie ma ograniczeń co do jej rozmiarów (poza ilością dostępnej pamięci)
zbiór liczb lub wyrażeń zapisanych w postaci prostokątnej tablicy
(ang. iterable) obiekt, który ma budowę sekwencyjną; może być przekazywany do pętli for
w celu zwracania pojedynczych elementów większej całości; obiektami iterowanymi są list, string, tuple
, np. [1, 3, 5] lub 'Python' lub (3, 6, 'A')
(ang. slice) wyrażanie zwracające wycinek obiektu iterowanego (lista, krotka, napis, itp.), zapisywane za pomocą nawiasów kwadratowych obiekt_iterowany[start:stop:krok]
, które jako argumenty przyjmuje początek, koniec (wyłącznie) oraz krok wycinka; przykładowo wyrażenie "Przyklad"[0:4:2]
da wynik Pz
(zwraca znaki pod indeksami 0 oraz 2)