Listy, krotki, slowniki, wyrazenia listowe i operacje na kolekcjach
ð Podstawa programowa: II.1+II.2Lista 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
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
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 to zwiezly sposob tworzenia list na podstawie istniejacych sekwencji. To jeden z najpotezniejszych elementow Pythona.
[wyrazenie for element in sekwencja if warunek]# 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}
# 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}")
Stworz liste 10 losowych ocen (1-6). Oblicz srednia, mediane, znajdz najczesciej wystepujaca ocene (dominanta). Wyswietl oceny posortowane rosnaco.
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}")
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).
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())}")
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.
# 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}")
Stworz macierz 3x3 jako liste list. Napisz funkcje: transpozycja(m), suma_macierzy(m1, m2), wyswietl_macierz(m). Przetestuj na przykladowych danych.
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))