Lekcja 6. Listy, krotki i słowniki w Pythonie — kolekcje danych
ŚredniPo co się tego uczymy?
Pojedyncze zmienne z pierwszej lekcji tego działu wystarczają do jednej wartości — ale prawdziwe programy przetwarzają CAŁE zbiory danych: listę ocen klasy, bazę produktów w sklepie, słownik tłumaczeń. Listy, krotki i słowniki to trzy podstawowe struktury danych Pythona — bez nich żaden poważniejszy program (w tym każdy algorytm z działu obok) nie mógłby powstać.
Teoria
Lista (list, zapis []) — uporządkowany, MODYFIKOWALNY zbiór elementów, indeksowany od 0. Najważniejsze operacje: lista[i] (odczyt elementu o indeksie i), lista[-1] (ostatni element — ujemne indeksy liczą OD KOŃCA), lista[i] = x (zmiana elementu), append(x) (dodanie na koniec), insert(i, x) (wstawienie na pozycję i), pop() (usunięcie i zwrócenie ostatniego elementu), remove(x) (usunięcie PIERWSZEGO wystąpienia wartości x), len(lista) (długość), sort() (sortowanie rosnąco W MIEJSCU), x in lista (sprawdzenie przynależności).
Krotka (tuple, zapis ()) — działa jak lista (indeksy, len(), in, pętla for), ale jest NIEMODYFIKOWALNA — po utworzeniu nie da się zmienić, dodać ani usunąć elementu. Używa się jej, gdy dane MAJĄ pozostać stałe (np. współrzędne punktu, dni tygodnia) — daje to też pewność, że żadna część programu przypadkiem ich nie zmieni.
Słownik (dict, zapis {}) — przechowuje dane w PARACH klucz:wartość, zamiast indeksów liczbowych używa DOWOLNYCH kluczy (najczęściej tekstowych). Klucze w jednym słowniku MUSZĄ być unikalne. Operacje: slownik["klucz"] (odczyt — rzuci błąd KeyError, jeśli klucza nie ma), slownik.get("klucz", domyslna) (bezpieczny odczyt z wartością domyślną, gdy klucza brak), slownik["klucz"] = wartość (dodanie/zmiana), del slownik["klucz"] (usunięcie), .keys()/.values()/.items() (odpowiednio: same klucze, same wartości, PARY klucz-wartość).
Kiedy użyć czego? Lista — gdy kolejność ma znaczenie i dane będą się zmieniać (np. lista zadań do zrobienia). Krotka — gdy dane są STAŁYM zestawem, który nie powinien się zmieniać (np. wymiary ekranu (1920, 1080)). Słownik — gdy dane naturalnie opisuje się NAZWANYMI polami, a nie kolejnością (np. dane jednej osoby: imię, wiek, klasa).
List comprehension (składanie list) — zwarty, "pythonowy" sposób tworzenia nowej listy na podstawie innej, w JEDNEJ linijce: kwadraty = [x**2 for x in range(1, 6)] daje [1, 4, 9, 16, 25] — to skrót dla pętli for, która tworzyłaby tę samą listę przez wielokrotne append(). Można też dodać warunek: parzyste = [x for x in range(20) if x % 2 == 0].
Schemat
LISTA [] KROTKA () SŁOWNIK {}
[10, 20, 30] (10, 20, 30) {"imie": "Zosia",
indeks: 0,1,2 indeks: 0,1,2 "wiek": 17}
MOŻNA zmieniać NIE MOŻNA zmieniać dostęp przez KLUCZ,
append/insert/pop (tylko odczyt) nie indeks
LIST COMPREHENSION:
zwykła pętla: składanie list (jedna linijka):
wynik = [] wynik = [x**2 for x in range(1,6)]
for x in range(1, 6):
wynik.append(x**2)
→ oba dają: [1, 4, 9, 16, 25]
Przykład z życia
Dziennik elektroniczny przechowuje oceny ucznia jako LISTĘ (bo dochodzą nowe oceny przez cały rok), dane osobowe ucznia jako SŁOWNIK (imię, nazwisko, klasa — dostęp przez nazwę pola, nie numer), a datę urodzenia jako KROTKĘ (dzień, miesiąc, rok) — te trzy dane nie powinny się nigdy przypadkiem zmienić w trakcie działania programu.
listy_krotki_slowniki.py
# LISTA - modyfikowalna kolekcja
oceny = [4, 5, 3, 5, 6]
print("Oceny:", oceny)
print("Pierwsza ocena:", oceny[0])
print("Ostatnia ocena:", oceny[-1])
oceny.append(4) # dodaj nową ocenę na koniec
print("Po dodaniu:", oceny)
srednia = sum(oceny) / len(oceny)
print(f"Średnia: {srednia:.2f}")
# KROTKA - niemodyfikowalna
wspolrzedne = (52.2297, 21.0122) # Warszawa: szerokość, długość
print("Współrzędne:", wspolrzedne)
# wspolrzedne[0] = 10 # BŁĄD! Krotki nie można zmieniać
# SŁOWNIK - dane opisane nazwanymi kluczami
uczen = {
"imie": "Zosia",
"wiek": 17,
"klasa": "3A"
}
print("Imię:", uczen["imie"])
uczen["wiek"] = 18 # zmiana wartości
uczen["email"] = "zosia@szkola.pl" # dodanie nowego klucza
print("Po zmianach:", uczen)
# LIST COMPREHENSION - zwarte tworzenie listy
kwadraty = [x**2 for x in range(1, 6)]
print("Kwadraty:", kwadraty)
iteracja_po_kolekcjach.py
# Pętla po liście, krotce i słowniku
oceny = [4, 5, 3, 5, 6]
for ocena in oceny:
print(ocena, end=" ")
print()
wspolrzedne = (52.2297, 21.0122)
for wspolrzedna in wspolrzedne:
print(wspolrzedna)
uczen = {"imie": "Zosia", "wiek": 17, "klasa": "3A"}
for klucz, wartosc in uczen.items():
print(f"{klucz}: {wartosc}")
# Bezpieczny odczyt ze słownika - get() z wartością domyślną
telefon = uczen.get("telefon", "brak danych")
print(f"Telefon: {telefon}") # nie rzuci błędu, mimo że klucza nie ma
Komentarz i wyjaśnienie kodu
oceny[-1] to charakterystyczna dla Pythona składnia UJEMNEGO indeksowania — -1 zawsze oznacza OSTATNI element, -2 przedostatni, itd. — wygodniejsze niż pisanie oceny[len(oceny) - 1].
uczen.get("telefon", "brak danych") to BEZPIECZNY sposób odczytu z słownika — gdyby użyć uczen["telefon"] dla klucza, którego nie ma, program rzuciłby błąd KeyError i się zatrzymał; .get() zamiast tego zwraca podaną wartość domyślną.
for klucz, wartosc in uczen.items(): to najwygodniejszy sposób przejścia po słowniku, gdy potrzebujesz OBU elementów pary naraz — .items() zwraca każdą parę jako krotkę, którą Python automatycznie "rozpakowuje" do dwóch zmiennych pętli.
Ćwiczenie samodzielne
Uruchom kod i dodaj do słownika uczen nowy klucz "przedmioty" zawierający LISTĘ ulubionych przedmiotów (np. ["matematyka", "informatyka"]) — to pokazuje, że słowniki i listy można ZAGNIEŻDŻAĆ jedne w drugich.
Plac zabaw — wypróbuj online
Poniższy kod wykonuje się od razu w Twojej przeglądarce — nic nie trzeba instalować. Zmień kod i kliknij „Uruchom”.
Zadania do pracy własnej
Utwórz listę pięciu swoich ulubionych filmów (jako teksty). Wypisz ją całą, a potem osobno pierwszy i ostatni element.
Utwórz słownik opisujący siebie (imię, wiek, miasto, hobby jako lista) i wypisz wszystkie informacje w czytelnej formie, używając pętli
for klucz, wartosc in ...items():. Dodaj nowy klucz i zmień wartość jednego z istniejących.Napisz program zarządzający prostą listą zakupów jako listą SŁOWNIKÓW — każdy produkt to słownik z kluczami
"nazwa"i"cena"(np.{"nazwa": "mleko", "cena": 3.50}). Program powinien: wypisać wszystkie produkty, obliczyć sumę wszystkich cen (pętlaforpo liście słowników,suma += produkt["cena"]), i znaleźć NAJDROŻSZY produkt (analogicznie do wzorca "znajdź maksimum" z lekcji o pętli for).
Typowe błędy
Próba zmiany elementu krotki (krotka[0] = x) — rzuci błąd TypeError, bo krotki są celowo niemodyfikowalne; jeśli potrzebujesz zmieniać dane, użyj listy.
Odczyt nieistniejącego klucza słownika przez [] zamiast .get() — slownik["klucz"] dla brakującego klucza rzuci KeyError i zatrzyma program; jeśli klucz MOŻE nie istnieć, zawsze używaj .get() z wartością domyślną.
Mylenie list.sort() (sortuje W MIEJSCU, zwraca None) z sorted(list) (zwraca NOWĄ, posortowaną listę, oryginał bez zmian) — próba lista = lista.sort() "kasuje" listę, zamieniając ją na None, bo sort() nic nie zwraca (modyfikuje oryginał bezpośrednio).
Nawiązanie do egzaminu zawodowego
Listy i słowniki to podstawa niemal każdego bardziej złożonego zadania na maturze rozszerzonej — od prostego przetwarzania danych po struktury używane w dziale "Algorytmy i złożoność" (stos, kolejka, grafy reprezentowane jako słownik list sąsiadów). To domyka fundament Pythona — od tej lekcji jesteś gotów/gotowa na algorytmy z sąsiedniego działu.