I_R_PY_W13A_M06 Zbiory
W przedstawionej poniżej prezentacji zostały omówione najważniejsze cechy struktur danych wykorzystywanych przy rozwiązywaniu problemów w języku Python. Zwróć uwagę na sposób definiowania każdej z tych struktur oraz na powiązane z nimi metody i funkcje. Następnie rozwiąż Problem 1
Krotki, słowniki i zbiory – złożone typy danych

Zmienne z jedną wartością

W prostych zmiennych możemy zapisać tylko pojedyncze wartości.
Kiedy chcemy zapamiętać nowe dane, musimy tworzyć nowe zmienne.
Związek między pojedynczymi wartościami nie jest oczywisty.
Przykładowe zmienne typu prostego, które przechowują jedną wartość:
bok1 = 3
bok2 = 4
bok3 = 5
obwod = bok1 + bok2 + bok3
imie = "Jan"
nazwisko = "Dobry"
ocena = 3Typy złożone
Dzięki typom złożonym możemy zapisywać wiele wartości w jednym nazwanym pojemniku, czyli w strukturze danych.
Przykłady typów złożonych w języku Python:
listy;
krotki;
słowniki;
zbiory.
Poszczególne typy różnią się od siebie. W tym e‑materiale omawiamy trzy z nich: krotki, słowniki oraz zbiory.
Krotki
Struktura krotki:
krotka = (x, y, z)ID | Imię | Nazwisko | Ocena |
|---|---|---|---|
1 | Anna | Kowalska | 4 |
2 | Piotr | Nowak | 5 |
3 | Jan | Dobry | 3 |
Przykładowy kod
Uruchom w interpreterze języka Python:
# Tworzenie krotek
osoba1 = (1, 'Anna', 'Kowalska', 4)
osoba2 = tuple([2, 'Piotr', 'Nowak', 5])
dane=['3', 'Jan', 'Dobry', '3']
osoba3=tuple(dane)
# Odczytywanie wartości
print(osoba1[1], osoba1[2], osoba3[3])
# Modyfikacja elementu listy
dane[1] = 'Adam'
print(dane)
# Modyfikacja elementu krotki daje błąd
osoba3[0]='Ola'Charakterystyka
Krotki to niemodyfikowalny typ danych. Raz stworzona krotka nie może zmieniać swojej zawartości, nie da się do niej dodawać elementów ani ich usuwać.
Do zawartości krotek można odwoływać się, wykorzystując indeksy.
Możemy iterować po zawartości krotki, wykorzystując pętlę.
Elementy krotki mogą być różnego typu.
![Zrzut ekranu przedstawia okno IDLE Python z uruchomioną konsolą interaktywną. W konsoli wpisano i wykonano poniższy kod źródłowy:
python
osoba1 = (1, 'Anna', 'Kowalska', 4)
osoba2 = tuple([2, 'Piotr', 'Nowak', 5])
dane = ['3', 'Jan', 'Dobry', 3]
osoba3 = tuple(dane)
print(osoba1[1], osoba1[2], osoba3[3])
# Wynik: Anna Kowalska 3
dane[1] = 'Adam'
print(dane)
# Wynik: ['3', 'Adam', 'Dobry', 3]
osoba3[0] = 'Ola'
# Traceback (most recent call last):
# File "/usr/lib/python3.10/idlelib/run.py", line 578, in runcode
# exec(code, self.locals)
# File "<pyshell#10>", line 1, in](https://static.zpe.gov.pl/portal/f/res-minimized/RR6yzQHqlBFUr/1751354301/X5HXzS5QncxCm6rGwm8ahluBDHMTOcoJ.png)
Zastosowanie krotek
Uruchom w interpreterze języka Python:
Kod zaprezentowany w filmie:
boki_trojkata = (3, 4, 5)
oceny = (4, 5, 3, 4, 4, 4)
oceny.count(4)
oceny.count(5)
obwod_trojkata = sum(boki_trojkata)
len(oceny)
max(oceny)
min(oceny)Skrypt, który możesz wpisać i uruchomić:
boki_trojkata = (3, 4, 5)
oceny = (4, 5, 3, 4, 4, 4)
print(oceny.count(4))
print(oceny.count(5))
obwod_trojkata = sum(boki_trojkata)
print(obwod_trojkata)
print(len(oceny))
print(max(oceny))
print(min(oceny))Wynik działania programu:
4
1
12
6
5
3Słownik
Przykładem innej struktury złożonej jest słownik.
Struktura słownika:
słownik = {klucz: wartość}Przykładowy kod
Uruchom w interpreterze języka Python:
# Tworzenie słownika
osoba_1 = {'lp':1, 'imie':'Anna', 'nazwisko':'Kowalska'}
osoba_2 = dict(lp=2, imie='Jan', nazwisko='Nowak')
osoby = {1:osoba_1, 2:osoba_2}
# Odczytywanie wartości
print(osoba_1['imie'])
print(osoba_2.get('imie'))
print(osoby[1]['imie'])
print(osoba_1.values())
# Dodawanie i zmienianie wartości
osoba_2['ocena'] = 4
osoba_2['imie'] = 'Piotr'
osoba_2Charakterystyka
W słowniku przechowujemy pary elementów (klucze oraz wartości). Są one modyfikowalne.
Do wartości znajdujących się w słowniku odwołujemy się za pomocą klucza.
Klucze oraz wartości mogą być dowolnego typu.
Możliwe jest iterowanie po elementach słownika.

Zastosowanie słowników
Uruchom w interpreterze języka Python:
rzymskie = {1: 'I', 2: 'II', 3: 'III'}
rzymskie[2]
kolory = {} # Pusty słownik
kolory['red'] = '#FF0000'
kolory['blue'] = '#00FF00'
kolory['blue']
samochod = {'nazwa': 'syrena', 'model': '105', 'rocznik': 1972}
print(samochod['nazwa'], samochod['model'])
samochod.get('rocznik')
list(kolory) # Zwraca listę kluczy
len(kolory) # Liczba elementów
del kolory['blue'] # Usunięcie wartości
print(kolory)
Zbiór
Inną strukturą złożoną jest zbiór.
Struktura zbioru:
zbiór = {'a', 'b', 'c'}
Zbiory
Uruchom w interpreterze języka Python:
# Tworzenie zbioru
samogloski = set()
samogloski
unikalne_liczby = set([1, 3, 3, 5, 7, 9, 9])
unikalne_liczby
unikalne_litery = set('abrakadabra')
unikalne_litery
gloski = {'b', 'c', 'd'}
# Wartości w zbiorach nie są indeksowane
print(gloski[0])
Zastosowanie zbiorów
Uruchom w interpreterze języka Python:
pola = {'A1', 'A2', 'A3'}
zajete = {'A2', 'A3'}
inne = {'B1', 'B2', 'B3'}
# Dodawanie i usuwanie elementów
pola.add('A4')
print(pola)
pola.discard('A1')
print(pola)
# Operacje na zbiorach
len(pola) # Liczba elementów
pola | inne # Suma zbiorów
pola & zajete # Część wspólna
pola - zajete # Różnica zbiorów
Krotki, słowniki, zbiory – podobieństwa
Uruchom w interpreterze języka Python:
krotka = (7, 3, 5)
slownik = {7:'g', 3:'c', 5:'e'}
zbior = {8, 4, 6, 5}
# Liczba elementów
print(len(krotka), len(slownik), len(zbior))
# Czy w strukturze jest element?
3 in krotka
4 in zbior
5 in slownik
4 in slownik
# Suma wartości liczbowych lub kluczy
print(sum(krotka), sum(zbior), sum(slownik))
# Wartość minimalna i maksymalna
print(min(krotka), min(zbior), min(slownik))
print(max(krotka), max(zbior), max(slownik))
Jesteś kinomaniakiem i masz mnóstwo ulubionych filmów! Chcesz je uporządkować w taki sposób, aby:
Móc przechowywać listę tytułów wszystkich Twoich ulubionych filmów.
Dla każdego filmu móc szybko sprawdzić jego gatunek i rok wydania.
Jakie struktury danych w Pythonie pomogą Ci rozwiązać ten problem?
Napisz program, który umożliwi swobodne przetwarzanie twoich filmów
Przykładowe rozwiązanie:
Do rozwiązania tego problemu idealnie sprawdzą się dwie struktury danych:
Lista (list): Do przechowywania ogólnej kolekcji tytułów filmów, które są Twoimi ulubionymi. Lista pozwoli na łatwe dodawanie nowych filmów i zachowanie ich kolejności (jeśli jest to ważne).
Słownik (dictionary): Do przechowywania szczegółowych informacji o każdym filmie (gatunek, rok wydania). Słownik jest idealny, ponieważ możesz użyć tytułu filmu jako klucza, a jako wartości przechowywać inne informacje o nim.
# 1. Tworzymy listę ulubionych tytułów filmów
ulubione_tytuly_filmow = [
"Incepcja",
"Matrix",
"Interstellar",
"Forest Gump",
"Skazani na Shawshank"
]
# 2. Tworzymy słownik, który przechowuje szczegóły każdego filmu
# Kluczem jest tytuł filmu, a wartością jest kolejny słownik z gatunkiem i rokiem.
szczegoly_filmow = {
"Incepcja": {"gatunek": "Science Fiction", "rok_wydania": 2010},
"Matrix": {"gatunek": "Science Fiction", "rok_wydania": 1999},
"Interstellar": {"gatunek": "Science Fiction", "rok_wydania": 2014},
"Forest Gump": {"gatunek": "Dramat", "rok_wydania": 1994},
"Skazani na Shawshank": {"gatunek": "Dramat", "rok_wydania": 1994}
}
# --- Jak możemy wykorzystać te struktury? ---
# Wyświetlamy wszystkie ulubione filmy z listy:
print("Moje ulubione filmy:")
for tytul in ulubione_tytuly_filmow:
print(f"- {tytul}")
print("\n---")
# Sprawdzamy szczegóły konkretnego filmu za pomocą słownika:
film_do_sprawdzenia = "Incepcja"
if film_do_sprawdzenia in szczegoly_filmow:
info = szczegoly_filmow[film_do_sprawdzenia]
print(f"Szczegóły filmu '{film_do_sprawdzenia}':")
print(f" Gatunek: {info['gatunek']}")
print(f" Rok wydania: {info['rok_wydania']}")
else:
print(f"Brak informacji o filmie '{film_do_sprawdzenia}'.")
print("\n---")
# Dodajemy nowy film do obu struktur:
nowy_film_tytul = "Blade Runner 2049"
ulubione_tytuly_filmow.append(nowy_film_tytul)
szczegoly_filmow[nowy_film_tytul] = {"gatunek": "Science Fiction", "rok_wydania": 2017}
print(f"Dodano nowy film: {nowy_film_tytul}. Nowa lista ulubionych filmów:")
for tytul in ulubione_tytuly_filmow:
print(f"- {tytul}")