Lesson 11
Słowniki
1. Słowniki
Normalne listy (tablice) są zwykle zbiorem ponumerowanych elementów, więc jeśli chcesz odwołać się do dowolnego elementu listy, musisz podać jego numer. Numer elementu na liście jednoznacznie identyfikuje sam przedmiot. Ale numery identyfikacyjne nie zawsze są wygodne. Na przykład trasy pociągów w Rosji używają liter i cyfr jako kodu identyfikacyjnego (numer i jedna cyfra), a także kod numeryczno-alfabetyczny identyfikuje loty, tj. Informacje o lotach, pociągach lub identyfikatorze statku powietrznego powinny być przechowywane nie jako liczba, ale jako ciąg tekstowy.
Struktura danych, która pozwala na użycie dowolnego typu indeksu zamiast liczbowego, nazywa się słownikiem lub tablicą asocjacyjną . Odpowiednia struktura danych w Pythonie nosi nazwę dict
.
Rozważ prosty przykład. Pobierz słownik Capitals
, gdzie indeks to nazwa kraju, a wartość - nazwę stolicy tego kraju. Teraz z rzędu z nazwą kraju możemy z łatwością zidentyfikować kapitał.
# Stwórz puste kapitaliki Capitals = dict() # Wypełnij go pewnymi wartościami Capitals['Russia'] = 'Moscow' Capitals['Ukraine'] = 'Kiev' Capitals['USA'] = 'Washington' Countries = ['Russia', 'France', 'USA', 'Russia'] for country in Countries: # Dla każdego kraju z listy sprawdź, czy znajduje się on w słowniku Stole if country in Capitals: print('The capital of ' + country + ' is ' + Capitals[country]) else: print('The capital of ' + country + ' is unknown')
Zatem każdy element słownika składa się z dwóch obiektów: klucza i wartości . W naszym przykładzie klucz jest nazwą kraju, a wartość jest nazwą kapitału. Klawisz identyfikuje element słownika, wartość to dane odpowiadające danemu kluczowi. Wartości kluczy są unikalne, tzn. Nie może być dwóch identycznych kluczy w słowniku.
Jesteśmy przyzwyczajeni do słowników wokół nas, zwykłych papierowych słowników (definiujących, jednojęzycznych, dwujęzycznych). Do definiowania słownika kluczem jest słowo (tytuł artykułu), a wartością jest sam artykuł, a aby uzyskać dostęp do artykułu, należy podać słowo-klucz.
Książka telefoniczna to kolejny przykład struktury danych słownika. W takim przypadku klucz jest nazwą, a wartość jest numerem telefonu. Zarówno dla słownika, jak i książki telefonicznej łatwo jest znaleźć element słownika z danym kluczem (np. Jeśli rekordy są przechowywane w kolejności alfabetycznej kluczy, możesz łatwo znaleźć swój klucz za pomocą wyszukiwania binarnego), ale jeśli klucz jest nieznany, a znamy tylko wartość, wyszukiwanie elementu o podanej wartości może wymagać spójnego widoku wszystkich elementów słownika.
Ważną cechą tablicy asocjacyjnej jest to, że jest dynamiczna, tzn. Można dodawać nowe elementy za pomocą dowolnych klawiszy i usuwać istniejące elementy. Ilość użytej pamięci jest proporcjonalna do wielkości tablicy asocjacyjnej. Dostęp do elementów tablicy asocjacyjnej jest wolniejszy niż w przypadku zwykłych tablic, ale wciąż dość szybko.
W języku Python kluczem może być dowolny niezmienny (niezmienialny) typ danych: liczby całkowite i liczby rzeczywiste, łańcuchy, krotki. Kluczem w słowniku nie mogą być ustawione, ale mogą być elementem typu frozenset
: specjalny typ danych analogiem typu set
, które nie mogą być zmienione po utworzeniu. Wartość elementu słownika może być dowolnym typem danych, w tym modyfikowalnym.
2. Stosowanie słowników
Słowniki są używane w następujących przypadkach:
Num['January'] = 1; Num['February'] = 2; ...
Pusty słownik można utworzyć za pomocą funkcji dict()
lub pustej pary nawiasów klamrowych {}
(w rzeczywistości jest to powód, dla którego nawiasy klamrowe nie mogą być użyte do utworzenia pustego zestawu). Aby utworzyć słownik z pewnym zestawem wartości początkowych, możesz użyć następujących konstrukcji:
Capitals = {'Russia': 'Moscow', 'Ukraine': 'Kiev', 'USA': 'Washington'} Capitals = dict(RA = 'Moscow', Ukraine = 'Kiev', USA = 'Washington') Capitals = dict([("Russia", "Moscow"), ("Ukraine", "Kiev"), ("USA", "Washington")]) Capitals = dict(zip(["Russia", "Ukraine", "USA"], ["Moscow", "Kiev", "Washington"])) print(Capitals)
Pierwsze dwie metody mogą być używane tylko do tworzenia małych słowników, wymieniając wszystkie ich elementy. Ponadto, w drugiej metodzie, klucze są przekazywane jako nazwane parametry dict
, tak więc w tym przypadku kluczami mogą być tylko łańcuchy i tylko poprawne identyfikatory. W trzecim i czwartym przypadku można tworzyć duże słowniki, jeśli przeniesione argumenty są gotową listą, którą można uzyskać nie tylko poprzez listę wszystkich elementów, ale są one budowane w inny sposób podczas wykonywania programu. W trzeciej dict
funkcja dict
musi otrzymać listę, w której każdy element jest krotką dwóch elementów: klucza i wartości. Czwarta metoda wykorzystuje funkcję zip
, która musi otrzymać dwie listy o równej długości: listę kluczy i listę wartości.
3. Praca z elementami słownika
Podstawowa obsługa: uzyskanie wartości elementu przez jego klucz. Jest napisane dokładnie tak, jak w przypadku list: A[key]
. Jeśli w słowniku nie ma elementu z określonym kluczem, wywołuje on wyjątek KeyError
.
Innym sposobem definiowania wartości na podstawie klucza jest metoda get
: A.get(key)
. Jeśli nie ma elementu z kluczem get
w słowniku, to zwraca None
. W postaci dwóch argumentów A.get(key, val)
zwraca wartość val
, jeśli element z key
nie znajduje się w słowniku.
Aby sprawdzić, czy element należy do słownika, używane są operacje in
i not in
, tak jak w przypadku zestawów.
Aby dodać nowy element do słownika, wystarczy przypisać mu pewną wartość: A[key] = value
.
Aby usunąć element ze słownika, możesz użyć del A[key]
(operacja wywołuje wyjątek KeyError
jeśli nie ma takiego klucza w słowniku). Oto dwa bezpieczne sposoby na usunięcie elementu ze słownika.
A = {'ab' : 'ba', 'aa' : 'aa', 'bb' : 'bb', 'ba' : 'ab'} key = 'ac' if key in A: del A[key] try: del A[key] except KeyError: print('There is no element with key "' + key + '" in dict') print(A)
W pierwszym przypadku sprawdzamy wstępnie obecność elementu, a następnie przechwytujemy i obsługujemy wyjątek.
Innym sposobem na usunięcie elementu ze słownika jest metoda pop
: A.pop(key)
. Ta metoda zwraca wartość usuniętego elementu, a jeśli element z danym kluczem nie znajduje się w słowniku, zgłaszany jest wyjątek. Jeśli pop
metoda otrzyma drugi parametr, to w przypadku brakującego elementu zwróci wartość tego parametru. Pozwala to bezpiecznie organizować usunięcie elementu ze słownika: A.pop(key, None)
.
4. Iterujący słownik
Możesz łatwo iterować za pomocą klawiszy wszystkich elementów w słowniku:
A = dict(zip('abcdef', list(range(6)))) for key in A: print(key, A[key])
Następujące metody zwracają reprezentację elementów słownika. Reprezentacje są podobne do zestawów, ale zmieniają się, jeśli zmienisz wartości elementów. keys
metod zwracają reprezentację kluczy wszystkich elementów, values
zwracają reprezentację wszystkich wartości, a items
metody zwracają reprezentację wszystkich par (krotek) kluczy i wartości.
Tak więc, aby szybko sprawdzić, czy wartość val
należy do wszystkich wartości słownika A
, należy użyć wartości warunkowej boolean val in A.values()
. Aby zapętlić klawisze i zmienne, możesz wykonać następujące czynności:
A = dict(zip('abcdef', list(range(6)))) for key, val in A.items(): print(key, val)