2.9. Słowniki

Słownik to odwzorowanie kluczy na wartości. Każdy klucz jest wyszukiwany bezpośrednio; słownik zapamiętuje, jaka wartość była ostatnio powiązana z danym kluczem.

2.9.1. Tworzenie słowników

Użyj nawiasów klamrowych z parami key: value albo konstruktora dict:

empty   = {}
person  = {"name": "OpenMV", "id": 42}
counts  = dict(a=1, b=2, c=3)            # keyword form
pairs   = dict([("x", 1), ("y", 2)])     # from a list of pairs

Wartościami mogą być dowolne typy – łańcuchy znaków, liczby, listy, a nawet inne słowniki:

config = {
    "name":  "OpenMV",
    "id":    42,
    "width": 320,
    "tags":  ["red", "round"],
}
Słownik przedstawiony jako dwie kolumny: klucze po lewej, wartości po prawej, ze strzałkami łączącymi każdą parę.

Każdy klucz w słowniku odwzorowuje się dokładnie na jedną wartość.

2.9.2. Dostęp i przynależność

Indeksowanie za pomocą [] pobiera wartość dla klucza. Brakujący klucz powoduje zgłoszenie KeyError:

>>> person = {"name": "OpenMV", "id": 42}
>>> person["name"]
'OpenMV'
>>> person["missing"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'missing'

Aby wyszukiwanie było bardziej wyrozumiałe, użyj dict.get(). Dla brakującego klucza zwraca ona None lub wartość przekazaną jako drugi argument:

>>> person.get("name")
'OpenMV'
>>> person.get("missing")            # returns None
>>> person.get("missing", "n/a")
'n/a'

Słowo kluczowe in sprawdza przynależność klucza – a nie wartości:

>>> "name" in person
True
>>> "OpenMV" in person
False

2.9.3. Dodawanie, aktualizowanie i usuwanie

Przypisanie do d[key] dodaje wpis, jeśli klucz jest nowy, i nadpisuje go, jeśli już istnieje:

>>> person["seen"] = 1
>>> person["seen"] = 2               # overwrites
>>> person
{'name': 'OpenMV', 'id': 42, 'seen': 2}

Usuwanie ma kilka postaci:

  • del d[key] – usuwa wpis; zgłasza KeyError, jeśli klucza brak.

  • dict.pop() – usuwa i zwraca wartość; opcjonalna wartość domyślna pozwala uniknąć wyjątku.

  • dict.clear() – usuwa wszystkie wpisy.

dict.update() scala inny słownik (lub listę par (key, value)) z odbiorcą, nadpisując wszelkie pasujące klucze:

>>> person.update({"id": 100, "owner": "alice"})
>>> person
{'name': 'OpenMV', 'id': 100, 'seen': 2, 'owner': 'alice'}

2.9.4. Iterowanie

Iterowanie bezpośrednio po słowniku zwraca jego klucze w kolejności wstawiania:

for k in person:
    print(k)

Trzy widoki dają jawny dostęp:

for key, value in person.items():
    print(key, "=", value)

2.9.5. Co może być kluczem

Klucze słownika muszą być haszowalne – ich wartość nie może zmieniać się przez cały czas ich życia. Typowe typy haszowalne to:

Typy zmienne, takie jak list, dict i bytearray, nie mogą być kluczami; użycie takiego typu zgłasza TypeError. Krotki niezmiennych wartości to standardowy sposób na kluczowanie słownika za pomocą złożonego identyfikatora, takiego jak współrzędna w siatce dwuwymiarowej:

>>> grid = {}
>>> grid[(0, 0)] = "start"
>>> grid[(5, 7)] = "end"

2.9.6. Długość

len() zwraca liczbę wpisów:

>>> len(person)
4