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"],
}
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łaszaKeyError, 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:
dict.keys()– klucze (to samo, co iterowanie po słowniku).dict.values()– wartości.dict.items()– krotki(key, value), idealne do rozpakowywania w pętli.
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