Opublikowano: 21 marca 2019

Aktualizacja: 26 marca 2019

Słownik jest strukturą danych działającą w oparciu o klucze (a nie indeksy jak w przypadku sekwencji) oraz przypisane im wartości. Klucze mogą być obiektem dowolnego typu (napisy, liczby, tablice itp.). Słowniki, inaczej zwane odwzorowaniami (ang. mapping) nie utrzymują żadnej uporządkowanej kolejności (jest ona losowa - hashowana, dzięki czemu wyszukiwanie kluczy jest tak szybkie) jak np listy, jednak podobnie jak one są nieograniczone i mutowalne (zmienne). Słowniki są jednym z najbardziej elastycznych typów wbudowanych, są tablicami asocjacynymi - tabelami zawierającymi referencje do obiektów zapewniającymi bardzo szybkie pobieranie danych.

Tworzenie słowników:
Konstrukcja słownika składa się z par klucz: wartość

# pusty słownik
s = {}
# zdefiniowanie kluczy i ich wartości
s = {'imię': 'Sebastian', 'tel': '123-456-789', 'www': 'skynet-project.com'}
# zapis blokowy
s = {'imię': 'Sebastian',
'tel': '123-456-789',
'www': 'skynet-project.com'}
# dynamiczne tworzenie kluczy przez przypisanie
s = {}
s['imię'] = 'Sebastian'
s['tel'] = '123-456-789'
s['www'] = 'skynet-project.com'
# utworzenie słownika za pomocą konstruktora dict (klucz musi być stringiem!!!)
dict(name='Sebastian', web='skynet-project.com')
# utworzenie słownika za pomocą konstruktora dict oraz krotki zawierającej klucz i wartość
dict([('name', 'Sebastian'), ('web', 'skynet-project.com')])
# konstruktor fromkeys dla początkowej wartości wszystkich kluczy
dict.fromkeys(['name', 'web', 'adress'], 'xxx')
# wynik {'name': 'xxx', 'web': 'xxx', 'adress': 'xxx'}

Zagnieżdżanie
Dzięki zagnieżdżaniu można w jednym słowniku przechowywać bardziej rozbudowanie dane

# W słowniku s zagnieżdżam słownik ''dane podstawowe', krotkę 'wykształcenie',
# string 'tel' oraz listę 'języki programowania'
s = {'dane podstawowe': {'imię': 'Sebastian',
'miasto': 'Toruń'},
'wykształcenie': ('wyższe', 'magisterskie'),
'tel': '123-456-789',
'języki programowania': ['Python', 'JS/jQ', 'C++', 'Scratch']}

Dostęp do poszczególnych elementów powyższego słownika

# słownik 'dane podstawowe'
s['dane podstawowe'] # {'imię': 'Sebastian', 'miasto': 'Toruń'}
# krotka 'wykształcenie'
s[ 'wykształcenie'] # ('wyższe', 'magisterskie')
# string 'tel'
s['tel'] # '123-456-789'
# lista 'języki programowania'
s['języki programowania'] # ['Python', 'JS/jQ', 'C++']
# dostęp do elementu zagnieżdżonego słownika
s['dane podstawowe'][ 'miasto'] # 'Toruń'
# dostęp poprzez indeks zagnieżdżonej listy
s['języki programowania'][1] # 'JS/jQ'
# modyfikacja zagnieżdżonej listy
s['języki programowania'].append('Scratch') # ['Python', 'JS/jQ', 'C++', 'Scratch']
# metoda pop dla zagnieżdżonych list
s['języki programowania'].pop() # zwraca 'Scratch' i usuwa z listy 'języki programowania'
s['języki programowania'].pop(1) # zwraca indeks 1 czyli 'JS/jQ' i usuwa z listy 'języki ...'

Podstawowe operacje na słowikach. W związku z tym, że słowniki to odwzorowania, nie obsługują operacji znanych z typów sekwencyjnych, nie działają wycinki czy konkatenacja.

# sprawdzenie ilości elementów słownika
s = {'a': 10, 'd': 211, 'b': 24, 'c': 50}
len(s) # 4
# sprawdzenie wystąpienia elementu, zwraca True lub False
'a' in s # True
# modyfikacja słownika 'w miejscu'
s['d'] = (2, 1, 1) # {'a': 10, 'd': (2, 1, 1), 'b': 24, 'c': 50}
s['a'] = 'dziesięć' # {'a': 'dziesięć', 'd': (2, 1, 1), 'b': 24, 'c': 50}
# usunięcie klucza ze słownika
del s['d']
# utworzenie kopii
s2 = s.copy()
# utworzenie kopii wraz z zagnieżdżonymi elementami
import copy
s2 = copy.deepcopy(s)

Słowniki a pętla for. Ponieważ słowniki nie są sekwencjami, pętla for nie działa tak jak to ma się w przypadki list czy stringów. Dla przeprowadzenia iteracji przez klucze można wykorzystać metodę keys, zwróci ona listę kluczy którą można przepuścić przez pętlę.

#s = {'a': 10, 'd': 211, 'b': 24, 'c': 50}
# pętla for z wykorzystaniem metody keys
for i in s.keys(): print(i, end=', ') # wynik a, d, b, c,
# pętla for bez wykorzystania metody keys
for i in s: print(i, end=', ') # wynik a, d, b, c,
# pętla for z 'wymuszonym' wypisaniem wartości
for i in s: print('key: ', i, ', ', 'value: ', s[i], end=', ') # wynik:
#key: a , value: 10, key: d , value: 211, key: b , value: 24, key: c , value: 50,

Metody słowników

s = {'a': 10, 'd': 211, 'b': 24, 'c': 50}
# lista wartości
s.values() # dict_values([10, 211, 24, 50])
list(s.values()) # [10, 211, 24, 50])
# lista elementów słownika
s.items() # dict_items([('a', 10), ('d', 211), ('b', 24), ('c', 50)])
list(s.items()) # [('a', 10), ('d', 211), ('b', 24), ('c', 50)]
# pobranie klucza, metoda get
s.get('a')
# próba pobrania nieistniejącego klucza
s.get('xxx') # None
# pogranie nieistniejącego klucza
s.get('xxx', 51432) # zwraca 51432
# metoda update - łącznie słowników (a'la konkatenacja)
s = {'a': 10, 'd': 211, 'b': 24, 'c': 50}
s2 = {'e': 242, 'f': 232}
s.update(s2)
# metoda pop, usuwa klucze i zwraca ich zawartość
s.pop('a') # zwraca 10, klucz 'a' zostaje usunięty

Sortowanie kluczy.
Ponieważ słownik nie jest sekwencją klucze nie maja określonego porządku i kolejności. Jeśli zachodzi potrzeba posortowania kluczy należy skorzystać metody słownika keys, metody list sort oraz pętli for. Szybsza metoda sortowania polega na wykożystaniu funkcji wbudowanej sorted.

s = {'a': 10, 'd': 211, 'b': 24, 'c': 50}
# tworzymy listę kluczy
lk = list(s.keys()) # ['a', 'd', 'b', 'c']
# sortowanie listy
lk.sort() # ['a', 'b', 'c', 'd']
# iteracja przez posortowane klucze
for key in lk:
print('klucz: ' , key, ' - ' , 'wartość: ', s[key])
# szybsza metoda sortowania list
for key in sorted(s):
print('klucz: ' , key, ' - ' , 'wartość: ', s[key])

Pomoc Pythona dotycząca słowników:

help(dict)
dir(dict)

Spis treści:

Brak komentarzy

Zobacz również:


note-image

1.1 Wprowadzenie

Python to niezwykle potężny, wieloplatformowy, interpretowany, interaktywny oraz wysokopoziomowy język programowania ogólnego zastosowania, który jest jednocześnie stosunkowo łatwy w nauce. Został stworzony przez holenderskiego programistę Guido van Rossuma (BDFL) w 1990 r., a po raz pierwszy opublikowany w roku następnym. ...

Czytaj więcej
note-image

1.2 IDE dla Pythona

IDE - Zintegrowane środowisko programistyczne dedykowane do języka Python: Sublime Text 3 Jest to wieloplatformowy, rozbudowany i wysoce konfigurowalny edytor tekstu napisany w C++ oraz Pythonie. Zalety: - Darmowy (od czasu do czasu wyświetla komunikat zachęcający do rejestracji płatnej wersji) ...

Czytaj więcej
note-image

2.1 Podstawowe typy danych

Python zawiera wbudowane typy danych będące integralną i nieodłączną częścią tego języka programowania. Obiekty wbudowane znacznie ułatwiają pisanie programów, korzystanie z nich pozwala zaoszczędzić mnóstwo czasu. Wbudowane typy danych są zoptymalizowane pod kątem wydajności, są również opakowane w zestaw metod ...

Czytaj więcej