Liceum Klasa III 45 minut PP: II.1+II.2 | s. 343

Lekcja 2: Zaawansowane programowanie - listy, tablice, struktury danych

Listy, krotki, slowniki, wyrazenia listowe i operacje na kolekcjach

📋 Podstawa programowa: II.1+II.2
krotkalistaprogramowanieslownikstruktury danych
00:00
Wprowadzenie
5 min
00:05
Teoria
15 min
00:20
Cwiczenia
15 min
00:35
Podsumowanie
10 min
📚

Teoria

Listy w Pythonie

Lista to uporzdkowana kolekcja elementow, ktora moze przechowywac dane roznych typow. Listy sa mutowalne - mozna zmieniac ich zawartosc po utworzeniu. Indeksowanie zaczyna sie od 0.

# Tworzenie list
oceny = [5, 4, 3, 5, 6, 4]
imiona = ["Anna", "Jan", "Kasia"]
mieszana = [1, "tekst", True, 3.14]

# Dostep do elementow
print(oceny[0])      # 5 (pierwszy element)
print(oceny[-1])     # 4 (ostatni element)
print(oceny[1:4])    # [4, 3, 5] (wycinanie / slicing)

# Modyfikacja
oceny[0] = 6         # zmiana elementu
oceny.append(5)      # dodanie na koniec
oceny.insert(0, 3)   # wstawienie na pozycje 0
oceny.remove(3)      # usuniecie pierwszego wystapienia 3
usuniety = oceny.pop()  # usuniecie i zwrocenie ostatniego

# Przydatne metody
print(len(oceny))      # dlugosc listy
print(sorted(oceny))   # posortowana kopia
oceny.sort()           # sortowanie w miejscu
oceny.reverse()        # odwrocenie kolejnosci
print(4 in oceny)      # czy 4 jest w liscie? True/False

Krotki (tuple)

Krotka jest podobna do listy, ale jest niemutowalna - po utworzeniu nie mozna zmieniac jej elementow. Uzywamy nawiasow okraglych.

# Tworzenie krotek
wspolrzedne = (10, 20)
kolory_rgb = (255, 128, 0)
dane_osobowe = ("Jan", "Kowalski", 17)

# Dostep do elementow - tak samo jak w liscie
print(wspolrzedne[0])    # 10

# Rozpakowywanie krotki
imie, nazwisko, wiek = dane_osobowe
print(f"{imie} {nazwisko}, lat {wiek}")

# Krotki sa niemutowalne:
# wspolrzedne[0] = 15   # BLAD! TypeError

Slowniki (dict)

Slownik to kolekcja par klucz-wartosc. Klucze musza byc unikalne i niemutowalne (np. str, int, tuple). Slowniki sa niezwykle przydatne do przechowywania danych strukturalnych.

# Tworzenie slownika
uczen = {
    "imie": "Anna",
    "nazwisko": "Nowak",
    "wiek": 17,
    "oceny": [5, 4, 5, 6]
}

# Dostep do wartosci
print(uczen["imie"])           # Anna
print(uczen.get("klasa", "brak"))  # "brak" (wartosc domyslna)

# Modyfikacja
uczen["wiek"] = 18             # zmiana wartosci
uczen["klasa"] = "3a"          # dodanie nowej pary

# Iterowanie po slowniku
for klucz, wartosc in uczen.items():
    print(f"{klucz}: {wartosc}")

# Przydatne metody
print(uczen.keys())     # wszystkie klucze
print(uczen.values())   # wszystkie wartosci
del uczen["klasa"]      # usuniecie pary

Wyrazenia listowe (List Comprehensions)

Wyrazenia listowe to zwiezly sposob tworzenia list na podstawie istniejacych sekwencji. To jeden z najpotezniejszych elementow Pythona.

Skladnia: [wyrazenie for element in sekwencja if warunek]
Jest to rownowazne petli for z append, ale krotsze i czesciej szybsze.
# Kwadraty liczb od 1 do 10
kwadraty = [x**2 for x in range(1, 11)]
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

# Tylko liczby parzyste
parzyste = [x for x in range(1, 21) if x % 2 == 0]
# [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

# Zamiana na wielkie litery
slowa = ["python", "java", "c++"]
wielkie = [s.upper() for s in slowa]
# ["PYTHON", "JAVA", "C++"]

# Slownik comprehension
kwadraty_dict = {x: x**2 for x in range(1, 6)}
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

Operacje na kolekcjach

# Filtrowanie z filter()
liczby = [1, -2, 3, -4, 5, -6]
dodatnie = list(filter(lambda x: x > 0, liczby))
# [1, 3, 5]

# Transformacja z map()
podwojone = list(map(lambda x: x * 2, [1, 2, 3, 4]))
# [2, 4, 6, 8]

# Agregacja z zip()
imiona = ["Anna", "Jan", "Kasia"]
oceny = [5, 4, 6]
for imie, ocena in zip(imiona, oceny):
    print(f"{imie}: {ocena}")

# Enumerate - indeks + wartosc
for i, imie in enumerate(imiona):
    print(f"{i}. {imie}")
✏️

Zadania

Latwe

Zadanie 1: Operacje na liscie ocen

Stworz liste 10 losowych ocen (1-6). Oblicz srednia, mediane, znajdz najczesciej wystepujaca ocene (dominanta). Wyswietl oceny posortowane rosnaco.

Pokaz rozwiazanie
import random

oceny = [random.randint(1, 6) for _ in range(10)]
print(f"Oceny: {oceny}")
print(f"Srednia: {sum(oceny)/len(oceny):.2f}")

posortowane = sorted(oceny)
n = len(posortowane)
if n % 2 == 1:
    mediana = posortowane[n // 2]
else:
    mediana = (posortowane[n//2 - 1] + posortowane[n//2]) / 2
print(f"Mediana: {mediana}")

# Dominanta
from collections import Counter
licznik = Counter(oceny)
dominanta = licznik.most_common(1)[0][0]
print(f"Dominanta: {dominanta}")
print(f"Posortowane: {posortowane}")
Srednie

Zadanie 2: Slownik uczniow

Stworz slownik przechowujacy dane 5 uczniow (imie jako klucz, lista ocen jako wartosc). Napisz funkcje: srednia_ucznia(slownik, imie), najlepszy_uczen(slownik), wszyscy_powyzej(slownik, prog).

Pokaz rozwiazanie
uczniowie = {
    "Anna": [5, 4, 6, 5, 5],
    "Jan": [3, 4, 3, 4, 3],
    "Kasia": [6, 6, 5, 6, 6],
    "Piotr": [4, 3, 4, 5, 4],
    "Marta": [5, 5, 5, 4, 5]
}

def srednia_ucznia(slownik, imie):
    oceny = slownik[imie]
    return sum(oceny) / len(oceny)

def najlepszy_uczen(slownik):
    najl = max(slownik, key=lambda x: sum(slownik[x])/len(slownik[x]))
    return najl, srednia_ucznia(slownik, najl)

def wszyscy_powyzej(slownik, prog):
    return {imie: oceny for imie, oceny in slownik.items()
            if sum(oceny)/len(oceny) >= prog}

print(f"Srednia Anny: {srednia_ucznia(uczniowie, 'Anna'):.2f}")
najl, sr = najlepszy_uczen(uczniowie)
print(f"Najlepszy: {najl} (srednia {sr:.2f})")
print(f"Powyzej 4.5: {list(wszyscy_powyzej(uczniowie, 4.5).keys())}")
Srednie

Zadanie 3: Wyrazenia listowe

Uzyj wyrazen listowych do: a) stworzenia listy liczb podzielnych przez 3 i 7 z zakresu 1-200, b) zamiany listy slow na liste ich dlugosci, c) stworzenia slownika {litera: kod_ASCII} dla liter a-z.

Pokaz rozwiazanie
# a) Podzielne przez 3 i 7
podzielne = [x for x in range(1, 201) if x % 3 == 0 and x % 7 == 0]
print(f"Podzielne przez 3 i 7: {podzielne}")

# b) Dlugosci slow
slowa = ["Python", "programowanie", "lista", "informatyka"]
dlugosci = [len(s) for s in slowa]
print(f"Dlugosci: {dlugosci}")

# c) Litery i kody ASCII
ascii_dict = {chr(i): i for i in range(ord('a'), ord('z') + 1)}
print(f"ASCII: {ascii_dict}")
Trudne

Zadanie 4: Macierz jako lista list

Stworz macierz 3x3 jako liste list. Napisz funkcje: transpozycja(m), suma_macierzy(m1, m2), wyswietl_macierz(m). Przetestuj na przykladowych danych.

Pokaz rozwiazanie
def wyswietl_macierz(m):
    for wiersz in m:
        print([f"{x:4}" for x in wiersz])
    print()

def transpozycja(m):
    wiersze = len(m)
    kolumny = len(m[0])
    return [[m[j][i] for j in range(wiersze)] for i in range(kolumny)]

def suma_macierzy(m1, m2):
    return [[m1[i][j] + m2[i][j] for j in range(len(m1[0]))]
            for i in range(len(m1))]

# Testy
A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
B = [[9, 8, 7], [6, 5, 4], [3, 2, 1]]

print("Macierz A:")
wyswietl_macierz(A)
print("Transpozycja A:")
wyswietl_macierz(transpozycja(A))
print("A + B:")
wyswietl_macierz(suma_macierzy(A, B))
🎥

Materialy wideo

Harvard CS50 2019 - Wykład 5.5 - Struktury danych
CodeGym
18. Podstawy programowania w C# - Listy (List)
Impact IT Sp z o.o.
🎧

Podcasty

✔️

Quiz - sprawdz sie!

📜

Podstawa programowa

← Lekcja 1: Powtorzenie Siatka godzinowa Lekcja 3: Algorytmy sortowania →