TI/Programowanie dla Fizyków Medycznych:Struktury danych:Słowniki

Z Brain-wiki

Słowniki można zaliczyć do kategorii odwzorowań, przechowują one w nieuporządkowany sposób pary klucz-wartość, z czego klucze muszą być typów niezmiennych (liczby, napisy i krotki zawierające jedynie typy niezmienne). Klucze muszą być różne, aby jednoznacznie definiowały wartości.

Pusty słownik tworzy się następująco:

>>> D = {}
>>> D
{}
>>> D = dict()
>>> D
{}

a słownik zawierający elementy za pomocą wymienienia par klucz-wartość po przecinku w nawiasach wąsatych, przy pomocy funkcji wbudowanej dict, albo kopiując istniejący już słownik metodą copy:

>>> D = {'Ala' : 1, (1, 2, 3) : ['B', 'C'], 1 : "AKIA"}
>>> D
{1: 'AKIA', (1, 2, 3): ['B', 'C'], 'Ala': 1}
>>> D = dict(Ala = 1, Basia = 2)
>>> D
{'Basia': 2, 'Ala': 1}
>>> D = dict((('Ala', 1), ('Basia', 2)))
>>> D
{'Basia': 2, 'Ala': 1}
>>> D = dict([('Ala', 1), ('Basia', 2)])
>>> D
{'Basia': 2, 'Ala': 1}
>>> D = dict({'Basia': 2, 'Ala': 1})
>>> D
{'Basia': 2, 'Ala': 1}
>>> B = D.copy()
>>> B
{'Basia': 2, 'Ala': 1}

Ostatnią metodą tworzenia słowników jest wykorzystanie metody klasowej fromkeys - zwraca ona słownik z kluczami pochodzącymi z danej sekwencji i wartościami równymi zadanej wartości (jeśli ją pominiemy to przyjmowane jest None):

>>> dict.fromkeys(['A', 'B', 'C', 'D'])
{'A': None, 'C': None, 'B': None, 'D': None}
>>> dict.fromkeys(['A', 'B', 'C', 'D'], 5)
{'A': 5, 'C': 5, 'B': 5, 'D': 5}

Elementy słownika odczytujemy indeksując po kluczach (jeśli podamy klucz, który nie był w słowniku zostanie zgłoszony wyjątek), lub wywołując metodę get z podanym kluczem, można podać drugi parametr i wtedy zostanie on zwrócony w sytuacji gdy klucza nie było w słowniku (domyślnie jest przyjmowany None). W przeciwieństwie do list słowniki można rozszerzać przez zapisywanie elementów na klucze dotąd niewystępujące w słowniku. Ostatnią opcją odczytania elementów słownika jest metoda setdefault, której podajemy klucz i opcjonalnie wartość, która domyślnie jest przyjmowana None, jeśli klucz był w słowniku to zwracana jest odpowiadająca mu wartość inaczej jest wstawiana do słownika para klucz-zadana wartość i jest zwracana zadana wartość:

>>> D
{'a' : 1}
>>> D['a']
1
>>> D['z']

Traceback (most recent call last):
  File "<pyshell#105>", line 1, in <module>
    D['z']
KeyError: 'z'
>>> D.get('a')
1
>>> D.get('z')
>>> D.get('z', 5)
5
>>> D['b'] = 2
>>> D
{'a': 1, 'b': 2}
>>> D.setdefault('z')
>>> D
{'a': 1, 'b': 2, 'z': None}
>>> D.setdefault('a')
1
>>> D.setdefault('zz', 22)
22
>>> D
{'a': 1, 'b': 2, 'z': None, 'zz': 22}

Elementy słownika można usuwać przy pomocy słowa del, a cały słownik można wyczyścić metodą clear, pewną parę klucz-wartość (nie wiadomo którą) zwraca i usuwa ze słownika metoda popitem(), a metoda pop(key) zwraca i usuwa ze słownika wartość o kluczu key zgłaszając wyjątek gdy danego klucza nie ma w słowniku, jeśli podamy dodatkowy parametr, to jest on zwracany zamiast zgłaszania wyjątku:

>>> D
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}
>>> del D['c']
>>> D
{'a': 1, 'b': 2, 'e': 5, 'd': 4}
>>> D.popitem()
('a', 1)
>>> D
{'b': 2, 'e': 5, 'd': 4}
>>> D.pop('b')
2
>>> D.pop('f', 'gg')
'gg'
>>> D
{'e': 5, 'd': 4}
>>> D.clear()
>>> D
{}

Za pomocą operatora in i not in można testować czy dany klucz jest/nie jest w słowniku (można także użyć metody has_key):

>>> D = {'A': 5, 'C': 5, 'B': 5, 'D': 5}
>>> 'A' in D
True
>>> 'a' in D
False
>>> D.has_key('A')
True

Przy pomocy metody keys można uzyskać listę kluczy, metoda values zwraca listę wartości, a items listę krotek (klucz, wartość):

>>> D
{'Basia': 2, 'Ala': 1}
>>> D.keys()
['Basia', 'Ala']
>>> D.values()
[2, 1]
>>> D.items()
[('Basia', 2), ('Ala', 1)]

Iteratory do list kluczy, wartości i par klucz-wartość zwracają metody iterkeys, itervalues i iteritems. Zarówno listy jak i iteratory można wykorzystać w pętli for do przeglądania słownika.

Wielkość słownika można sprawdzić funkcją len.

Do słownika można dodać elementy z innego słownika przy pomocy metody update:

>>> D
{'a': 1, 'b': 2}
>>> D.update({'a' : 3, 'c' : 4}) #Zwróć uwagę, że wartość przypisana do klucza 'a' uległa zmianie
>>> D
{'a': 3, 'c': 4, 'b': 2}