Menu

Słowniki w Pythonie: tworzenie, odczyt, aktualizacja i iteracja po dict

Słowniki to w Pythonie struktura klucz-wartość: typ danych, po który będziesz sięgać bez przerwy, gdy tylko opanujesz podstawy.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ