Blog JSystems - uwalniamy wiedzę!

Szukaj
Słownik jako mapa klucz-wartość
Słownik - mapa klucz → wartość, z przykładami odczytu i dodawania

Słowniki są zbiorem składającym się z klucza i wartości powiązanej z tym kluczem. Mogą spełniać taką samą rolę jak słowniki w bazach danych. Przypuśćmy że w hurtownii produktów AGD-RTV mamy wiele produktów wielu marek i wielu rodzajów. Na każdym z produktów znajduje się naklejka z kodem typu "AMICA561", które wykorzystujemy do odnalezienia szerszych informacji o produkcie. Oczywiście pod danym kluczem/kodem mogą znajdować się informacje tylko o jednym produkcie. Dwa produkty nie mogą posiadać tego samego kodu. W podobny sposób działają słowniki w Pythonie. Zwykle korzystając z klucza będziemy wyszukiwać wartość. Słowniki podobnie jak listy (i przeciwnie do krotek) są modyfikowalne.

Tworzenie słowników

Podobnie jak w przypadku list czy krotek, mamy kilka wariantów tworzenia słowników. Poniżej przykład tworzenia pustych słowników:

slownik={}
slownik2=dict()

Możemy też tworząc słownik, od razu zapełnić go danymi:

info={
    "LG123": "Telewizor 60' z HD Ready, wejściem na internety i filtrem reklam",
    "SONY666": "Piekielnie dobry telewizor",
    "SZAJSUNG999": "Telewizor świetnie nadający się do zakrycia dziury w ścianie (i niczego więcej)"
}

Wartości "LG123", "SONY666", "SZAJSUNG999" są w powyższym słowniku kluczami i to właśnie z nich korzystając będziemy wyszukiwali wartości. Wartości znajdują się po prawej stronie każdej wartości klucza po znaku ":". Kluczem mogą być nie tylko ciągi tekstowe, ale również liczby czy typy złożone. Podobnie rzecz ma się z wartościami

Pobieranie wartości ze słowników

Wartości ze słowników pobieramy na podstawie klucza. Poniższa konstrukcja może się wydać znajoma. Być może skojarzysz ją z pobieraniem wartości z krotek czy list, choć tam pobieraliśmy wartości za pomocą indeksu który był liczbowy. W tym przypadku nie chodzi jednak o indeks elementu, a o wartość klucza. Nadałem kluczom wartości tekstowe by uniknąć nieporozumień. Gdybyś wywołał np. "info[2]" to nie oznaczałoby to pobrania elementu z trzeciej pozycji (jak w przypadku list czy krotek) a element o kluczu "2" (który wcale nie musiałby się na tej pozycji znaleźć). Same klucze mogą być mieszanych typów. W obrębie jednego słownika możesz mieć zarówno klucze tekstowe jak i liczbowe.

print(  info["SONY666"]  )

Po słownikach możemy iterować w podobny sposób jak po listach czy krotkach, z tą różnicą że tutaj iterator jest kluczem a nie wartością:

for i in info:
    print(info[i])

Taki zapis będzie równoznaczny z:

for k in info.keys():
    print(info[k])

Wynik działania powyższego kodu:

Telewizor 60' z HD Ready, wejściem na internety i filtrem reklam
Piekielnie dobry telewizor
Telewizor świetnie nadający się do zakrycia dziury w ścianie (i niczego więcej)

"i" w tym przypadku reprezentuje kolejne klucze w ramach słownika. Przechodzimy po całej długości słownika i korzystając z kolejnych wartości klucza wywołujemy "info[i]", czyli pobieramy kolejne wartości na podstawie kolejnego klucza.

W drugim przypadku skorzystałem z wbudowanej funkcji "keys" z której skorzystanie w takim kontekście da nam taki sam wynik jak poprzednie rozwiązanie. Słowniki posiadają też funkcję "values" która działa na podobnej zasadzie jak "keys", z tą różnicą że zamiast listy kluczy zwraca listę wartości (po której również możemy iterować). Lets czek dis ałt:

print(info.keys())

zwraca:

dict_keys(['LG123', 'SONY666', 'SZAJSUNG999'])

a:

print(info.values())

zwraca:

dict_values(["Telewizor 60' z HD Ready, wejściem na internety i filtrem reklam", 'Piekielnie dobry telewizor', 'Telewizor świetnie nadający się do zakrycia dziury w ścianie (i niczego więcej)'])

Podobnie jak w listach czy krotkach, możemy analogiczną konstrukcją sprawdzić czy obiekt znajduje się na liście:

if "LG123" in info:
    print("Mamy taki produkt")
else:
    print("niet :(")

W podobny sposób możemy przeszukać wartości zamiast kluczy, i tu właśnie skorzystamy z funkcji "values":

if "Telewizor 60' z HD Ready, wejściem na internety i filtrem reklam" in info.values():
    print("mamy produkt o takim opisie")
else:
    print("taki opis nie pasuje do żadnego produktu")

Sprawdzana w "if" wartość musi jednak dokładnie odpowiadać wartości ze słownika. Zwracam na to uwagę ponieważ w przypadku omawianych wcześniej łańcuchów tekstowych konstrukcja typu "if 'wartość' in 'coś coś coś wartość' zwróciłaby True i mógłbyś się tym zasugerować.

Modyfikacja zawartości słowników

Dodajemy i nadpisujemy elementy słowników w taki sam sposób:

info["KLUCZ"]="WARTOŚĆ"

Jeśli w słowniku nie będzie elementu o podanym kluczu to zostanie od dodany. Jeśli będzie, zostanie nadpisany.

Kasowanie elementu ze słownika odbywa się w podobny sposób jak w krotkach czy listach, z tą różnicą że zamiast indeksu elementu podajemy jego klucz:

del info["LG123"]

Łączenie słowników operatorem | (Python 3.9 i nowsze)

Od Pythona 3.9 dwa słowniki połączymy operatorem "|", który tworzy nowy słownik będący sumą obu. Jeśli ten sam klucz występuje po obu stronach, wygrywa wartość z prawego słownika:

ustawienia_domyslne = {'jezyk': 'pl', 'motyw': 'jasny', 'powiadomienia': True}
ustawienia_uzytkownika = {'motyw': 'ciemny'}

wynik = ustawienia_domyslne | ustawienia_uzytkownika
print(wynik)
{'jezyk': 'pl', 'motyw': 'ciemny', 'powiadomienia': True}

Klucz "motyw" wystąpił w obu słownikach, więc w wyniku znalazła się wartość z prawej strony ("ciemny"). To wygodny wzorzec do nadpisywania ustawień domyślnych wartościami podanymi przez użytkownika. Istnieje też wariant "|=", który zamiast tworzyć nowy słownik, dokłada elementy do już istniejącego:

ustawienia_domyslne |= ustawienia_uzytkownika
print(ustawienia_domyslne)

Wcześniej (i nadal) ten sam efekt dawała metoda "update", ale operator "|" jest krótszy i czytelniejszy, gdy chcemy dostać nowy słownik zamiast modyfikować istniejący.

Szkolenie Python od podstaw, przez analizę danych, do machine learning w JSystems

Ten kurs daje Ci solidne podstawy Pythona. Jeśli chcesz pójść dalej i pod okiem trenera dojść od pierwszej linijki kodu do własnego modelu uczenia maszynowego, sprawdź nasze pięciodniowe szkolenie Python od podstaw, przez analizę danych, do machine learning. Pierwsze trzy dni to Python w praktyce: typy i kolekcje, instrukcje warunkowe i pętle, funkcje, moduły i pakiety, pliki tekstowe, usługi sieciowe oraz praca z bazą PostgreSQL. Czwarty dzień to analiza danych w pandas (wczytywanie CSV, TSV i XLS, filtrowanie, agregacje, statystyki) i wizualizacja w Matplotlib, Seaborn oraz Plotly. Piąty dzień to uczenie maszynowe w scikit-learn: regresja liniowa i logistyczna, drzewa decyzyjne, las losowy, XGBoost, walidacja predykcji, dobór hiperparametrów i przeciwdziałanie przeuczeniu. Szkolenie ma terminy gwarantowane, czyli odbywa się niezależnie od wielkości grupy.

Szkolenie Python od podstaw, przez analizę danych, do machine learning

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Czym jest słownik w Pythonie?
Słownik to kolekcja par klucz i powiązana z nim wartość, przypominająca słowniki znane z baz danych. Zwykle podając klucz wyszukujemy wartość. Pod jednym kluczem może kryć się tylko jedna wartość, a klucze w obrębie słownika muszą być unikalne.
Jak utworzyć słownik i jak pobrać z niego wartość?
Pusty słownik tworzymy nawiasami klamrowymi albo funkcją dict, a od razu wypełniony podając pary klucz i wartość rozdzielone dwukropkiem. Wartość pobieramy po kluczu, a nie po pozycji, więc zapis z kluczem 2 oznacza element o kluczu 2, a nie trzeci element w kolejności.
Jak iterować po słowniku oraz jego kluczach i wartościach?
Iterując wprost po słowniku dostajemy kolejne klucze, tak samo jak przy użyciu metody keys, i po nich pobieramy wartości. Metoda values zwraca same wartości, po których również można iterować. Obecność klucza sprawdzamy operatorem in, a obecność wartości operatorem in na values.
Jak dodawać, nadpisywać i usuwać elementy słownika?
Przypisanie wartości do klucza dodaje nowy element, jeśli klucza nie było, albo nadpisuje istniejący. Aby usunąć element, używamy instrukcji del z podaniem klucza (a nie indeksu). Klucze i wartości mogą być mieszanych typów, w tym tekstowe i liczbowe.
Jak połączyć dwa słowniki operatorem w Pythonie 3.9 i nowszym?
Od Pythona 3.9 dwa słowniki łączymy operatorem, który tworzy nowy słownik będący ich sumą; przy powtórzonym kluczu wygrywa wartość z prawej strony. Wariant z przypisaniem dokłada elementy do istniejącego słownika. To wygodny sposób nadpisywania ustawień domyślnych wartościami użytkownika, czytelniejszy niż metoda update.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...