Zanurkuj w Pythonie/Słowniki
Słowniki
edytujJednym z wbudowanych typów są słowniki (ang. dictionary). Określają one wzajemną relację między kluczem a wartością.
Słowniki w Pythonie są podobne do haszy w Perlu. W Perlu zmienne przechowujące hasz są reprezentowane zawsze przez początkowy znak % . W Pythonie typ danych jest automatycznie rozpoznawany. Pythonowy słownik przypomina ponadto instancję klasy Hashtable w Javie, a także instancję obiektu Scripting.Dictionary w Visual Basicu.
|
Definiowanie słowników
edytujPrzykład. Definiowanie słowników
>>> d = {"server":"mpilgrim", "database":"master"} #(1) >>> d {'database': 'master', 'server': 'mpilgrim'} >>> d["server"] #(2) 'mpilgrim' >>> d["database"] #(3) 'master' >>> d["mpilgrim"] #(4) Traceback (most recent call last): File "<stdin>", line 1, in ? KeyError: 'mpilgrim'
- Najpierw utworzyliśmy nowy słownik z dwoma elementami i przypisaliśmy go do zmiennej
d
. Każdy element w słowniku jest parą klucz-wartość, a zbiór elementów jest ograniczony nawiasem klamrowym. 'server'
jest kluczem, a skojarzoną z nim wartością jest'mpilgrim'
, do której odwołujemy się poprzezd["server"]
.'database'
jest kluczem, a skojarzoną z nim wartością jest'master'
, do której odwołujemy się poprzezd["database"]
.- Możesz dostać się do wartości za pomocą klucza, ale nie możesz dostać się do klucza za pomocą wartości. Tak więc
d["server"]
zwraca'mpilgrim'
, ale wywołanied["mpilgrim"]
sprawi, że zostanie rzucony wyjątek, ponieważ'mpilgrim'
nie jest kluczem słownikad
.
Modyfikowanie słownika
edytujPrzykład. Modyfikowanie słownika
>>> d {'database': 'master', 'server': 'mpilgrim'} >>> d["database"] = "pubs" #(1) >>> d {'database': 'pubs', 'server': 'mpilgrim'} >>> d["uid"] = "sa" #(2) >>> d {'database': 'pubs', 'uid': 'sa', 'server': 'mpilgrim'}
- Klucze w słowniku nie mogą się powtarzać. Przypisując wartość do istniejącego klucza, będziemy nadpisywać starszą wartość.
- W każdej chwili możesz dodać nową parę klucz-wartość. Składnia jest identyczna do tej, która modyfikuje istniejącą wartość. Czasami może to spowodować pewien problem. Możemy myśleć, że dodaliśmy nową wartość do słownika, ale w rzeczywistości nadpisaliśmy już istniejącą.
Zauważmy, że słownik nie przechowuje kluczy w sposób posortowany. Wydawałoby się, że klucz 'uid'
powinien się znaleźć za kluczem 'server'
, ponieważ litera s jest wcześniej w alfabecie niż u. Jednak tak nie jest. Elementy słownika znajdują się w losowej kolejności.
W słownikach nie istnieje określona kolejność układania elementów. Nie możemy dostać się do elementów w słowniku w określonej, uporządkowanej kolejności (np. w porządku alfabetycznym). Oczywiście są sposoby, aby to osiągnąć, ale te "sposoby" nie są wbudowane w sam słownik. |
Pracując ze słownikami pamiętajmy, że wielkość liter kluczy ma znaczenie.
Przykład. Nazwy kluczy są wrażliwe na wielkość liter
>>> d = {} >>> d["klucz"] = "wartość" >>> d["klucz"] = "inna wartość" #(1) >>> d {'klucz': 'inna wartość'} >>> d["Klucz"] = "jeszcze inna wartość" #(2) >>> d {'klucz': 'inna wartość', 'Klucz': 'jeszcze inna wartość'}
- Przypisując wartość do istniejącego klucza zamieniamy starą wartość na nową.
- Nie jest to przypisanie do istniejącego klucza, a ponieważ łańcuchy znaków w Pythonie są wrażliwe na wielkość liter, dlatego też
'klucz'
nie jest tym samym co'Klucz'
. Utworzyliśmy nową parę klucz-wartość w słowniku. Obydwa klucze mogą się wydawać podobne, ale dla Pythona są zupełnie inne.
Przykład. Mieszanie typów danych w słowniku
>>> d {'bazadanych': 'pubs', 'serwer': 'mpilgrim', 'uid': 'sa'} >>> d["licznik"] = 3 #(1) >>> d {'bazadanych': 'pubs', 'serwer': 'mpilgrim', 'licznik': 3, 'uid': 'sa'} >>> d[42] = "douglas" #(2) >>> d {42: 'douglas', 'bazadanych': 'pubs', 'serwer': 'mpilgrim', 'licznik': 3, 'uid': 'sa'}
- Słowniki nie są przeznaczone tylko dla łańcuchów znaków. Wartość w słowniku może być dowolnym typem danych: łańcuchem znaków, liczbą całkowitą, obiektem, a nawet innym słownikiem. W pojedynczym słowniku wszystkie wartości nie muszą być tego samego typu; możemy wstawić do niego wszystko, co chcemy.
- Klucze w słowniku są bardziej restrykcyjne, ale mogą być łańcuchami znaków, liczbami całkowitymi i kilkoma innymi typami. Klucze wewnątrz jednego słownika nie muszą posiadać tego samego typu.
Usuwanie pozycji ze słownika
edytujPrzykład. Usuwanie pozycji ze słownika
>>> d {'licznik': 3, 'bazadanych': 'master', 'serwer': 'mpilgrim', 42: 'douglas', 'uid': 'sa'} >>> del d['42'] #(1) >>> d {'licznik': 3, 'bazadanych': 'master', 'serwer': 'mpilgrim', 'uid': 'sa'} >>> d.clear() #(2) >>> d {}
- Instrukcja
del
każe usunąć określoną pozycję ze słownika, która jest wskazywana przez podany klucz. - Instrukcja
clear
usuwa wszystkie pozycje ze słownika. Zbiór pusty ograniczony przez nawiasy klamrowe oznacza, że słownik nie ma żadnego elementu.
Materiały dodatkowe
edytuj- How to Think Like a Computer Scientist uczy o słownikach i pokazuje, jak wykorzystać słowniki do tworzenia rzadkich macierzy.
- W Python Knowledge Base możemy znaleźć wiele przykładów kodów wykorzystujących słowniki.
- Hottest Python Recipes wyjaśnia, jak sortować wartości słownika względem klucza.
- Python Library Reference opisuje wszystkie metody słownika.