Przejdź do głównej treści
eLearner.app
Moduł 3 · Lekcja 3 z 411/36 w kursie~12 min
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

Python
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

Python
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"]      # usuwa

Iteracja po słowniku

Python
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?

Python
"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ść".

Python
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

Ćwiczenie#python.m3.l3.e1
Próby: 0Ładowanie...

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`.

Ładowanie edytora...
Pokaż wskazówkę

Metoda .get('telefono', 'sconosciuto') nie zgłasza błędu KeyError.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie powtórzeniowe

Ćwiczenie#python.m3.l3.e2
Próby: 0Ładowanie...

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`.

Ładowanie edytora...
Pokaż wskazówkę

Metoda sum(prices.values()) sumuje wszystkie wartości w słowniku.

Rozwiązanie dostępne po 3 próbach

Dodatkowe wyzwanie

Ćwiczenie#python.m3.l3.e3
Próby: 0Ładowanie...

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ń.

Ładowanie edytora...
Pokaż wskazówkę

Metoda get przyjmuje drugi parametr jako wartość domyślną: user.get('role', 'guest').

Rozwiązanie dostępne po 3 próbach