Lekcje modułu (3/4)
Słowniki
Słownik (dict) to struktura odwzorowująca klucz → wartość: przypisujesz klucz
(prawie zawsze napis) do wartości dowolnego typu. Jest to fundamentalna
struktura danych do modelowania obiektów rzeczywistych.
Tworzenie słownika
vuoto = {}
utente = {"nome": "Ada", "anni": 36, "attivo": True}
# alternatywny konstruktor
utente = dict(nome="Ada", anni=36, attivo=True)Klucze muszą być hashowalne (immutable): napisy, liczby, krotki elementów hashowalnych. Wartości z kolei mogą być dowolnego typu — nawet innymi słownikami.
Dostęp, modyfikacja, usuwanie
utente["nome"] # 'Ada'
utente["email"] # KeyError!
utente.get("email") # None (bezpieczny domyślny)
utente.get("email", "—") # '—' (własny domyślny)
utente["citta"] = "Roma" # dodaje / aktualizuje
del utente["attivo"] # usuwaIteracja po słowniku
for chiave in utente: # iteruje po KLUCZACH (domyślnie)
print(chiave, utente[chiave])
for chiave in utente.keys(): # jawne
...
for valore in utente.values():
print(valore)
for chiave, valore in utente.items(): # najczęstszy idiom
print(f"{chiave} = {valore}")Kolejność iteracji to kolejność wstawiania (gwarantowana od Pythona 3.7 wzwyż).
Czy klucz istnieje?
"nome" in utente # True
"email" in utente # False (NIE sprawdza wartości, sprawdza klucz!)setdefault: inicjalizacja przy pierwszym dostępie
Częsty wzorzec: "jeśli klucz nie istnieje, ustaw wartość domyślną; w każdym przypadku zwróć aktualną wartość".
gruppi = {}
for nome in ["Ada", "Linus", "Ada", "Grace", "Linus", "Ada"]:
gruppi.setdefault(nome, []).append(1)
# {'Ada': [1, 1, 1], 'Linus': [1, 1], 'Grace': [1]}Istnieje również collections.Counter do zliczania (zobaczymy to w module stdlib).
Iteracja po słownikach
Możesz iterować po słownikowi na kilka sposobów:
for k in d: pętla tylko po kluczach (zachowanie domyślne).for k, v in d.items(): pętla jednocześnie po parach klucz-wartość (bardzo przydatne).for v in d.values(): pętla tylko po wartościach.
Spróbuj sam
Mając dany słownik `user = {'nome': 'Ada', 'anni': 36}`, dodaj klucz 'email' = 'ada@ex.com', a następnie przypisz do zmiennej `email_or_default` wartość klucza 'telefono' przy użyciu .get z wartością domyślną 'sconosciuto'. Oceń `email_or_default`.
Pokaż wskazówkę
Metoda .get('telefono', 'sconosciuto') nie zgłasza błędu KeyError.
Rozwiązanie dostępne po 3 próbach
Ćwiczenie powtórzeniowe
Mając dany słownik `prices = {'mela': 1.2, 'pera': 1.5, 'kiwi': 2.0}`, oblicz sumę wszystkich wartości i przypisz ją do zmiennej `total`. Oceń `total`.
Pokaż wskazówkę
Metoda sum(prices.values()) sumuje wszystkie wartości w słowniku.
Rozwiązanie dostępne po 3 próbach
Dodatkowe wyzwanie
Mając dany słownik `user = {'name': 'Alice'}`, użyj metody `.get()` do pobrania wartości dla klucza `'role'`. Jeśli klucz nie istnieje, niech metoda zwróci domyślną wartość `'guest'`. Zapisz wynik w `user_role` i go oceń.
Pokaż wskazówkę
Metoda get przyjmuje drugi parametr jako wartość domyślną: user.get('role', 'guest').
Rozwiązanie dostępne po 3 próbach