Słownik to tablica wyszukiwania
Listy są indeksowane pozycją. Słowniki są indeksowane kluczem, zwykle napisem albo liczbą, a każdy klucz wskazuje wartość. Ta jedna zmiana otwiera ogromną kategorię programów: inwentarze, konfiguracje, dane JSON, profile użytkowników, cache.
Klucze i wartości mogą być niemal czymkolwiek. Klucze muszą być hashowalne (czyli liczby, napisy, krotki, ale nie listy ani inne słowniki). Wartości nie mają ograniczeń: słownik może przechowywać cokolwiek, także inne słowniki czy listy.
Tworzenie słowników
Jest kilka sposobów i każdy ma swoje zastosowanie:
Odczyt wartości
Są dwa sposoby, a wybór ma znaczenie:
Wybieraj według zamiaru:
- Używaj
[], gdy klucz musi istnieć. Jeśli go nie ma, to błąd i chcesz głośnego komunikatu. - Używaj
.get(), gdy "brak" jest poprawnym przypadkiem. Pozwala to podać wartości domyślne bez try/except.
Dodawanie, aktualizacja, usuwanie
Przypisanie do klucza tworzy go albo aktualizuje:
update() scala inny słownik albo obiekt iterowalny z parami:
Wspólne klucze z overrides nadpisują te w settings.
Sprawdzanie klucza
in sprawdza klucze, a nie wartości:
Aby sprawdzić konkretnie wartości, użyj user.values():
Jak iterować po słowniku
Masz trzy widoki, po których możesz przejść pętlą:
Po .items() sięgasz najczęściej: daje parę, od razu rozpakowaną i gotową do użycia.
Kolejność iteracji we współczesnym Pythonie (3.7+) odpowiada kolejności wstawiania. Słownik nie jest "magicznym workiem": jeśli dodasz a, potem b, potem c, iteracja zwróci je w tej kolejności. To gwarancja języka, na której możesz polegać.
Jak posortować słownik
Słowniki zachowują kolejność wstawiania, więc "sortowanie" słownika oznacza tak naprawdę zbudowanie nowego słownika, do którego klucze wstawia się w wybranej kolejności:
sorted() zwraca listę par, a opakowanie jej w dict(...) odtwarza słownik w nowej kolejności. Jeśli potrzebujesz tylko posortowanych par (a nie słownika), pomiń zewnętrzne wywołanie dict().
Jak połączyć dwa słowniki
Python 3.9+ daje operator |:
Przy kolizji kluczy wygrywają wartości ze słownika stojącego po |. .update() to odpowiednik działający w miejscu. W starszych wersjach Pythona użyj {**defaults, **overrides}.
Wzorzec setdefault
Częsta potrzeba: "jeśli klucz istnieje, użyj jego wartości, a jeśli nie, ustaw wartość domyślną i dopiero jej użyj".
Albo, lepiej, użyj collections.Counter:
Counter to podklasa słownika, która domyślnie liczy. To właściwy wybór zawsze, gdy liczysz wystąpienia.
Dict comprehensions
Odpowiednik list comprehensions, tylko do budowania słowników:
Reguły są te same co w list comprehensions, ale między nawiasami klamrowymi jest key: value.
Słownik jako bliźniak JSON
Słowniki Pythona niemal dokładnie odpowiadają obiektom JSON. Konwersja w obie strony to jedno wywołanie:
Dlatego słowniki są wszędzie w pracy z aplikacjami webowymi: żądania i odpowiedzi API to w gruncie rzeczy operacje na słownikach z odrobiną sieci pośrodku.
Praktyczny przykład
Mały program w stylu konfiguracji, który przechowuje profil użytkownika:
Zagnieżdżone słowniki, modyfikowalne wartości, .get() z wartością domyślną: podstawowy zestaw narzędzi dla wszelkich danych w kształcie rekordu.
Idziemy dalej
Listy, krotki, zbiory, słowniki. Z tymi czterema kolekcjami możesz zamodelować niemal każde dane, na jakie trafisz na początku. Dalej poznamy list comprehension, czyli zwięzły sposób Pythona na przekształcenie jednej kolekcji w drugą.
Najczęściej zadawane pytania
Czym jest słownik w Pythonie?
Słownik to kolekcja par klucz-wartość. Wartość wyszukujesz po kluczu: prices['apple'] zamiast prices[0]. Słowniki są szybkie w odczycie i zapisie, klucze muszą być unikalne, a we współczesnym Pythonie zachowują kolejność wstawiania elementów.
Jak dodać klucz do słownika w Pythonie?
Przypisz do niego wartość: my_dict['new_key'] = 'new value'. Jeśli klucz już istnieje, wartość zostaje nadpisana. Jeśli nie, zostaje dodany. Nie ma rozróżnienia między "wstawieniem" a "aktualizacją": składnia jest ta sama.
Czym różni się dict[key] od dict.get(key)?
dict[key] zgłasza KeyError, jeśli klucza nie ma. dict.get(key) zwraca wtedy None (albo podaną przez ciebie wartość domyślną). Używaj .get(), gdy brak klucza jest spodziewany i normalny, a [key], gdy brak klucza oznacza błąd.