Dział III

Struktury Danych (Kolekcje)

Serce programowania maturalnego. Naucz się zarządzać kolekcjami danych za pomocą list, słowników i zbiorów, by drastycznie skrócić swój kod.

Wstęp: Kontenery na Twoje dane

Samymi pojedynczymi zmiennymi (jak x = 5) nie rozwiążesz zadania maturalnego, w którym musisz przeanalizować tysiące liczb. Potrzebujesz "kontenerów", które pomieszczą te informacje i pozwolą na nich masowo operować. Python posiada potężne wbudowane struktury danych, które na maturze często zastępują pisanie setek linijek skomplikowanego kodu.

1

Listy (Tablice 1D): Twoje główne narzędzie

Lista to uporządkowana kolekcja elementów, którą w Pythonie zapisujemy w nawiasach kwadratowych []. Jej największą zaletą jest dynamika – może swobodnie rosnąć i maleć w trakcie działania programu.

Modyfikacja: Dodawanie i Usuwanie
Do zarządzania zawartością listy używamy wbudowanych metod (wywoływanych po kropce).

L = [10, 20, 30]

# Dodawanie na koniec listy
L.append(40) # [10, 20, 30, 40]

# Usuwanie konkretnej wartości (pierwsze wystąpienie)
L.remove(20) # [10, 30, 40]

# Usuwanie po indeksie (i opcjonalne pobranie wartości)
ostatni = L.pop() # Usuwa i zwraca 40. L to teraz [10, 30]

Funkcje wbudowane (Złoto Maturalne)
Zamiast pisać własne pętle do szukania największej liczby czy sumowania, użyj gotowych funkcji! Zaoszczędzi to Twój cenny czas.

wyniki = [14, 2, 89, 5]

print(len(wyniki)) # Zwróci 4 (Rozmiar listy)
print(max(wyniki)) # Zwróci 89 (Największa wartość)
print(min(wyniki)) # Zwróci 2 (Najmniejsza wartość)
print(sum(wyniki)) # Zwróci 110 (Suma wszystkich)

Indeksowanie i Magia Slicingu (Wycinania)
Każdy element w liście ma swój numer (indeks), liczony od zera. Python posiada też potężny mechanizm slicingu, który pozwala na "wycinanie" fragmentów listy (lub ciągów znaków) za pomocą składni: lista[start:stop:krok].

# Indeksowanie (w tym ujemne!)
k = ["A", "B", "C", "D", "E"]

k[0] # "A" (Pierwszy element)
k[2] # "C" (Trzeci element)
k[-1] # "E" (Ostatni element - super przydatne!)
k[-2] # "D" (Przedostatni)

# Slicing [start:stop:krok]
k[1:4] # ["B", "C", "D"] (od 1 włącznie, do 4 bez)
k[:3] # ["A", "B", "C"] (od początku do 3)
k[2:] # ["C", "D", "E"] (od 2 do samego końca)
k[::2] # ["A", "C", "E"] (cała lista, co drugi element)
k[::-1] # ["E", "D", "C", "B", "A"] (ODWRACANIE!)

🔄
Maturalny Wytrych: Palindromy

Na egzaminie notorycznie pojawiają się zadania typu "sprawdź, czy dane słowo jest palindromem" (czyta się tak samo od lewej do prawej). W C++ wymaga to pisania pętli. W Pythonie, dzięki slicingowi i odwracaniu za pomocą kroku -1, sprawdzisz to jedną linijką!

slowo = "kajak"
if slowo == slowo[::-1]:
    print("To jest palindrom!")

2

Tablice 2D (Listy w listach): Maturalny klasyk

Zadania polegające na obróbce "obrazków" (siatek pikseli), plansz do gry w życie czy map wysokościowych to absolutne klasyki CKE. W Pythonie nie ma wbudowanego, specjalnego typu macierzowego. Takie struktury budujemy, tworząc listę, wewnątrz której znajdują się kolejne listy (reprezentujące wiersze).

Budowanie macierzy i Maturalna Pułapka

Na początku zadania często musisz stworzyć pustą planszę (np. wypełnioną zerami). NIGDY nie rób tego przez mnożenie list: [[0]*5]*5! W Pythonie skopiuje to tylko referencje (wskaźniki) do jednego wiersza – zmiana elementu w jednym wierszu zmieni go we wszystkich! Używaj List Comprehension.

# PRAWIDŁOWE tworzenie tablicy np. 3x3
N = 3
plansza = [[0 for _ in range(N)] for _ in range(N)]

# Dostęp do elementów: tablica[wiersz][kolumna]
plansza[0][0] = 1 # Lewy górny róg
plansza[2][2] = 9 # Prawy dolny róg

Zagnieżdżone Pętle (Przechodzenie)

Aby przejrzeć lub zmodyfikować każdy element planszy, potrzebujesz dwóch pętli for. Jedna odpowiada za poruszanie się po wierszach (od góry do dołu), a druga, wewnętrzna, po kolumnach w danym wierszu (od lewej do prawej).

# i - to zazwyczaj wiersz (y)
# j - to zazwyczaj kolumna (x)
for i in range(len(plansza)):
    for j in range(len(plansza[i])):
        # np. zerowanie parzystych elementów
        if plansza[i][j] % 2 == 0:
            plansza[i][j] = 0

🧭
Maturalny Wytrych: X i Y vs Wiersz i Kolumna

Na lekcjach matematyki przywykłeś, że współrzędne to (X, Y), gdzie X idzie poziomo, a Y pionowo. W informatyce, przy tablicach 2D, zapis jest odwrotny!



Używając zapisu tablica[A][B], pierwsza wartość A wybiera listę zewnętrzną, czyli wiersz (odpowiednik Y). Druga wartość B wybiera pozycję w tym wierszu, czyli kolumnę (odpowiednik X). Zapamiętaj: najpierw w dół, potem w prawo. Zawsze tablica[Y][X]!

3

Słowniki: Mistrzowie zliczania (dict)

Wyobraź sobie zadanie: "Podaj, ile razy wystąpiła każda z liter w pliku składającym się z 10 000 wierszy". Zamiast pisać 26 zmiennych (dla każdej litery alfabetu osobno), używamy słownika. Słownik przechowuje dane w parach: Klucz : Wartość.

Tworzenie i Podstawy
Słowniki definiujemy za pomocą nawiasów klamrowych { }. Klucz musi być unikalny (nie mogą istnieć dwa takie same klucze) i niemodyfikowalny (np. liczba lub string).

# Pusty słownik
oceny = {}

# Dodawanie / Zmiana wartości po kluczu
oceny["Kowalski"] = 5
oceny["Nowak"] = 4
oceny["Kowalski"] = 3 # Nadpisze poprzednią wartość!

print(oceny) # {'Kowalski': 3, 'Nowak': 4}

Maturalny Święty Graal: Zliczanie .get()
Gdy liczysz elementy z pliku, częstym błędem jest próba dodania +1 do klucza, który jeszcze nie istnieje. Metoda .get(klucz, domyślna_wartość) rozwiązuje ten problem.

litery = ['A', 'B', 'A', 'C', 'B', 'A']
licznik = {}

for znak in litery:
    # Jeśli klucza nie ma, weź 0. Dodaj 1.
    licznik[znak] = licznik.get(znak, 0) + 1

print(licznik) # {'A': 3, 'B': 2, 'C': 1}

Iteracja (Przechodzenie) po słowniku
Gdy masz już zliczone wyniki (np. ile razy wystąpił dany wyraz), musisz przejrzeć słownik, aby znaleźć ten, który wystąpił najwięcej razy.

# Metoda .items() (Klucz i Wartość naraz)
najczestsze = ""
max_wystapien = 0

for klucz, wartosc in licznik.items():
    if wartosc > max_wystapien:
        max_wystapien = wartosc
        najczestsze = klucz

Pamiętaj:
  • .keys() iteruje tylko po kluczach (domyślne zachowanie pętli).
  • .values() iteruje tylko po wartościach.
  • .items() to maturalny niezbędnik. Zwraca parę (klucz, wartość) przy każdym obrocie pętli, co ułatwia wszelkie wyszukiwania ekstremów.

4

Zbiory (set): Strażnicy unikalności

Zbiory w Pythonie (typ set) działają dokładnie tak samo, jak zbiory na lekcjach matematyki. Nie mają ustalonej kolejności (nie możesz użyć indeksu zbior[0]), ale za to ich najważniejszą cechą jest to, że nie pozwalają na istnienie duplikatów.

Magia jednej linijki: Usuwanie duplikatów

Najczęstsze zastosowanie zbiorów to błyskawiczne "wyczyszczenie" listy z powtarzających się elementów. Wystarczy rzutować listę na zbiór, a potem... z powrotem na listę!

# Mamy listę z powtórzeniami
liczby = [1, 2, 2, 3, 1]

# Rzutowanie na zbiór bezpowrotnie niszczy duplikaty
zbior = set(liczby)
print(zbior) # Wynik: {1, 2, 3}

# Wracamy do postaci listy (jeśli potrzebujemy indeksów)
czysta_lista = list(zbior)

Szybkość błyskawicy (O(1))

Gdy używasz operatora in (sprawdzanie czy element jest wewnątrz) na tradycyjnej liście, Python musi przeszukać ją po kolei. W przypadku set, odpowiedź jest natychmiastowa niezależnie od tego, czy zbiór ma 5 elementów, czy 5 milionów!

# Pusty zbiór tworzymy za pomocą set() (a nie {}!)
widziane = set()

# Dodawanie do zbioru (zamiast .append jest .add)
widziane.add("MATURA")

if "MATURA" in widziane:
    print("Już to słowo analizowaliśmy!")

🔑
Pewniak na egzamin: Pytanie o "różne" elementy

Gdy w zadaniu pojawia się sformułowanie: "Podaj, ile różnych (unikalnych) słów / znaków znajduje się w pliku", używamy natychmiastowego kombo funkcji len() oraz set().

ile_roznych = len(set(nasza_dluga_lista_z_pliku))

Struktury opanowane!

Masz już wszystkie narzędzia, aby zapanować nad tysiącami linijek danych z arkuszy maturalnych. Znasz pętle, pliki i kolekcje. Pora zaprząc je do pracy i poznać najważniejsze algorytmy liczbowe.

Przejdź do: Klasyczne Algorytmy Liczbowe ➡️