Python dla inżynierów

Python dla inżynierów: #5 Słowniki

Jednym z wbudowanych typów w Pytona są tzw. słowniki (ang. dictionary). Słownik jest strukturą danych podobną do list z tą różnicą, że słowniki nie pracują w oparciu o indeksy, ale w oparciu o parę: klucz – wartość. Można powiedzieć, że słowniki zbudowane są z par klucz – wartość, które to określają wzajemną relację między nimi.

Ta lekcja zaprezentuje Ci następujące punkty:

  1. Tworzenie słownika
  2. Operacje na słownikach
  3. Metody wbudowane słowników
  4. Zagnieżdżanie słowników
  5. Przykład zastosowania słowików

1. Tworzenie słownika

Utworzenie słownika wygląda trochę inaczej niż w listach. Jak wspomniałem na początku słowniki tworzymy jako parę „klucz – wartość” za pomocą klamer {} i dwukropka :. Przykład:

Możemy też utworzyć pusty słownik i dodawać do niego kolejne elementy:

W obu przypadkach moj_slownik będzie wyglądać tak:

Słowniki mają tę zaletę, że ich wartości mogą zawierać dowolny typ danych (np. napisy, liczby, listy etc.). Z kluczami jest już inaczej, bo muszą być one zestawami tego samego typu elementów, np. napisy, liczby etc. Nie da się jako zestaw kluczy podać jednocześnie np. listę i liczby – Python zwróci wtedy błąd. Słownik z mieszanymi typami danych wygląda przykładowo tak:

Wartości słownika wywołujemy przez odwołanie się do jego klucza:

Python zwróci tutaj ['i1', 'i2', 'i3'].

Możemy też odwołać się do zagnieżdżonego elementu w słowniku.

Dostaniemy tutaj wartość 'i1'.

2. Operacje na słownikach

Dodawanie i zamiana elementów w słowniku

Na pewno zwróciłeś już uwagę, że słowniki można modyfikować. W pierwszym przykładzie stworzyłem pusty słownik o nazwie moj_slownik i dodałem do niego nowe elementy. Dodawanie elementów do słownika odbywa się w ten sposób:

Teraz słownik dict1 ma nowy element i wygląda tak:

Wartości w słowniku można również modyfikować. Należy wtedy podać nazwę klucza, którego wartości chcemy zmienić i nową wartość.

Zmieniony słownik wyglądać będzie następująco:

Uwaga: Odwoływanie się przez klucz słownika jest jednoznaczne, ponieważ w danym słowniku nie może być dwóch takich samych nazw kluczy. Pamiętaj, że nazwy kluczy w słowniku są wrażliwe na wielkość liter! Pamiętaj też, że przypisanie wartości do istniejącego już klucza automatycznie nadpisuje starą wartość.

Inne działania na słownikach

Wartości słownika można również poddawać działaniom. Przykład:

Wartości w słowniku można modyfikować poprzez: dodawanie +, odejmowanie -, mnożenie/powielanie *, dzielenie /. Zasada jest taka sama jak np. działania na liczbach lub napisach.

Kilka innych przykładów modyfikacji słownika:

Po wykonaniu działań na elementach 'key1' i 'key2' otrzymamy w wyniku odpowiednio:

Usuwanie elementu słownika

Elementy słownika można również usuwać:

Słownik dict1 będzie teraz wyglądać tak: {'key1': 'napis', 'key2': 123}

Aby wyczyścić cały słownik używamy metody clear():

Teraz słownik dict1 jest pusty i wygląda tak {}.

3. Metody wbudowane słowników

Aby ustalić ile par „klucz – wartość” zawiera słownik, używamy znanej już funkcji len. Za pomocą metod items(), keys() lub values() możemy też wylistować zawartość słownika. Przykład:

Wynikiem będzie:

Aby zaktualizować słownik w oparciu o inny słownik używamy metody update:

Teraz słownik dict1 wygląda tak: {'k1': 'w1', 'k2': 'w2', 'k10': 10}.

Słowniki można poddawać wielu różnym operacjom. Jeśli chcesz się dowiedzieć jakie operacje są dostępne na słownikach wpisz w linii komendy polecenie dir(dict1).

4. Zagnieżdżanie słowników

Na koniec zostawiłem jeszcze jedną użyteczną właściwość słowników – zagnieżdżanie. Na jej przykładzie łatwo zauważysz jakim Python jest potężnym i elastycznym narzędziem. Jak sama nazwa wskazuje słowniki można zagnieżdżać nie tylko innymi listami etc., ale również samymi słownikami.

W ten sposób otrzymamy element słownika wartosc1.

5. Przykład zastosowania słowików

Zastosowanie słowników jest bardzo szerokie, zwłaszcza w połączeniu z funkcjami etc. Tutaj pokaże jeden prosty przykład – listę wytrzymałości betonów fck.

Wartość fck dla betonu klasy C25/30 jest równa 25.

Koniec przykładu :)

Zapis na newsletter

Podsumowanie

A teraz krótkie podsumowanie. Wiesz co to są słowniki i czym się różnią od innych typów zbiorów jak listy czy krotki. Potrafisz tworzyć słowniki i odwoływać się do wybranych elementów. Umiesz też dodawać do słowników nowe pary „klucz – wartość”o. Wiesz też jak usuwać elementy słownika i modyfikować jego wartości. Wiesz jak korzystać z metod wbudowanych słowników i jak zagnieżdżać słowniki (różne typy danych w słowniku, słownik w słowniku itd.).

Pamiętaj, ćwiczenia to najlepszy sposób, żeby poznać Pythona! Pobierz tutaj plik .py z tą lekcją i prześledź jeszcze raz kod. Jeśli miałbyś pytania, napisz do mnie w komentarzu.

W następnej lekcji zajmiemy się operatorami logicznymi [w opracowaniu].


Wpisy z cyklu „Python dla inżynierów„:

  1. Wprowadzenie do Pythona i Liczby
  2. Napisy (Strings)
  3. Listy
  4. Krotki
  5. Słowniki
Podziel się z innymi:

17 komentarzy

  • Próbowałem policzyć powtarzające się elementy listy i po 30. min pomyślałem „ja się do tego nie nadaje!” A wystarczy utworzyć pusty słownik i dodawać do niego  elementy z listy ;) Jeżeli element w słowniku istnieje, to tylko zwiększamy jego wartość o 1.

    Kolejna funkcja w programie dodana -raport występujących pozycji w plikach ;)

    • Uczę się pythona od jakiś 5-6 tyg i sto razy pomyślałam, że się do tego nie nadaje! A potem myślę, ok spróbuje jeszcze raz, może jednak …. ;-) Fajnie, że podzieliłeś się swoimi emocjami to też jest pomocne że jednak inni mają takie same trudności więc są one częścią procesu nauki czyli znaczy, że robimy postępy :-) Powodzenia!

  • Czesc,

    Bardzo ciekawy i pomocny artykul. Zastanawiam sie czy mozna uzyc krotki jako klucza? Np. dict = {(„key1”, „key2”): „wartosc”} Jezeli tak, to jak wywolac wartosc przy uzyciu takiego klucza?
    Z gory dziekuje za odpowiedz.

  • Hej wszystkim.

    Mam takie zadanie kwalifikacyjne:

    Napisz funkcję znajdującą najmniejszy i największy kurs
    waluty w podanym zakresie.

    Zaproponuj dwa rozwiązania:
    a) proste i skuteczne, niekoniecznie najefektywniejsze
    b) wydajne

    INPUT

    rates = [
    { „date”: „2019-11-02”, „rate”: 4.3422 },
    { „date”: „2019-11-03”, „rate”: 4.2210 },
    { „date”: „2019-11-04”, „rate”: 4.3455 },
    { „date”: „2019-11-05”, „rate”: 4.3456 },
    { „date”: „2019-11-06”, „rate”: 4.2311 }
    ]

    date_range = [„2019-11-03”, „2019-11-06”]

    OUTPUT

    {
    „min”: { „date”: „2019-11-03”, „rate”: 4.2210 },
    „max”: { „date”: „2019-11-05”, „rate”: 4.3456 }
    }

     

     

    Generalnie podpunkt a) rozwiązałem bez problemu:

     

    def znajdz(rates):
    a=[]
    for i in range(0,len(rates)):
    a.append(rates[i].get(„rate”))
    return {„xmin”: rates[a.index(min(a))], „xmax”: rates[a.index(max(a))]}

    rates = [
    { „date”: „2019-11-02”, „rate”: 4.3422 },
    { „date”: „2019-11-03”, „rate”: 4.2210 },
    { „date”: „2019-11-04”, „rate”: 4.3455 },
    { „date”: „2019-11-05”, „rate”: 4.3456 },
    { „date”: „2019-11-06”, „rate”: 4.2311 }
    ]

    date_range = [„2019-11-02”, „2019-11-06”]

    print(znajdz(rates))

     

     

    Natomiast głowię się na podpunktem b).  Czy ktoś mógłby podpowiedzieć o co dokładniej chodzi z tą wydajnością? Jak rozumiem, wydajność jest lepsza, kiedy czas wykonywania programu jest jak najkrótszy. Czy zatem powyższe zadanie da się zrobić jeszcze wydajniej niż to zrobiłem w podpunkcie a)? Będę wdzięczny za pomoc!

     

    Pozdrawiam,

    Nikodem

    PS a poza tym podobnie jak Grzesiek również po przeczytaniu tego tekstu czuję, że więcej rozumiem :) świetny artykuł, dzięki!

    • Czołem.
      Łukasz coś pisał w którejś częsści (z tej serii dla początkujących) że pewne dane w pythonie pracują szybciej.Chyba był to zbiór,czy string?Wybacz ale nie pamiętam.Może warto w twoim wypadku przeczytać wszystkie części (nie jest ich tak dużo) od nowa.Zapewne wtedy na to trafisz.Po prostu wiem że takie coś tu było a nie chce mi się tego szukać.
      Pozdrawiam,
      Grzesiek

        • Znalazłem.Jak byś jeszcze szukał;
          Python najszybciej działa na krotkach.Rezerwuje dla nich najmniej pamięci w przeciwieństwie do list i słowników.Czyli żeby program był jak najszybszy najlepiej było by go oprzeć o działanie właśnie na nich.
          Pozdrawiam
          Grzesiek.

  • Cześć

    Piszę sobie taki prosty programik,do sprawdzania aktualnego stanu wtym wypadku magazynu sklepowego.I mam problem typu że nie wiem jak zdefiniować pętle while aby ktoś kto wprowadza daną musiał wprowadzić liczbę całkowitą.Bo jeśli naciśnie przypadkowo enter albo jakąś liuterę to program wywali błąd i nie będzie działał.Mógł bym posłużyć sie zbiorem ale było by to bez sensu aby generować w nim wszystkie liczby.(: Mniej więcej tak to wygląda:Błąd oznaczyłem Haszem.Wie ktoś jak to zdefiniować?

    #!/usr/bin/env/phyton
    a = {
    'jabłka’ : 40,
    'brukselka’ : 50,
    'kapusta’ : 30,
    'wiśnie’ : 43,
    'buraki’ : 60
    }
    print(’stan magazynu %s’ % a)
    print(’podaj rodzaj produktu’)
    c = input()
    while (c in a) == False :
    print(’nie ma takiego produktu,wpisz poprawnie nazwę’)
    c = input()
    else :
    print(’istnieje w zasobach’)
    print(’ile go sprzedałeś?’)
    b = input()
    while (b != (%d) == True : # tu jest błąd.
    print(’wpisz liczbę całkowitą !’)
    b = input()
    a [’%s’ %c] = a [’%s’ %c] – int(b)
    print(’obecny stan magazynu : %s’ % a)

  • Łukasz,jestem pod wrażeniem.Tekst jest tak klarowny że jako poczatkujący wreszcie trafiłem na coś co w pełni rozumiem.Do tego o słowniku sa pisane takie rzeczy których juz  3-eci dzień szukamłem w danych podanych tak chaotycznie…. a tu napisane tak że nie da się tego nie zrozumieć.Dzięki.Te informacje są kluczowe dla mojego projektu.Prowadzisz coś w Udemy?

      • Projekt to może za dużo powiedziane.Niedawno zacząłem się uczyć Pythona.Jest piękny.Już wcześniej chciałem programować jako młody człowiek ale w tamtych czasach jak jeszcze nie było internetu (przynajmniej w Polsce) mówiono że aby to robić to trzeba być mistrzem w matematyce….Teraz widzę że nie koniecznie.Choć ten kto rozumie macierze na pewno będzie miał sporą przewagę.Python jest piękny.Co do „projektu” to planuję stworzyć rozbudowany program do monitorowania dużej produkcji,zamówień,realizacji,remanentów,wysyłek.Coś na wzór MES-a.Jest u mnie w pracy i z poziomu praktyka widzę lepsze rozwiązania które można by wprowadzić.Potrzebne mi będzie do tego później narzędzie do generowania interaktywnych okien.Robię to hobbystycznie,dla siebie.Widzę że zajmujesz się także przywracaniem konstrukcji i budynków do użyteczności.Musiałem kiedyś podjąć wyzwanie o podobnej tematyce.Ratowania starego drewniaka.Odziedziczyłem go w spadku(nikt go nie chciał).Trzeba było robić dach.Żaden dekarz nie chciał się podjąć jego postawienia na spróchniałych ścianach,poza tym zrobienie tego było by zbyt ryzykowne więc wyspawałem wokół niego konstrukcję na której został postawiony.Jest dużo lepiej zrobiona jak te schody(: .Później obudowałem je drewnem.Fajnie to wygląda z tymi wszystkimi zastrzałami.Teraz ściany mogą runąć a dach dalej będzie stał.Ludzie którzy tędy przejeżdżali i widzieli wcześniejszy a potem aktualny stan budynku (miałem sporo takich gości,nawet z daleka) pytali się jak to zrobiłem i ile to kosztuje.A Ci którzy widzieli go po raz pierwszy mówili że postawiłem sobie nowy dom.Co prawda nie mam takiej wiedzy jak Ty ale to jest ciekawe jak z ruiny można zrobić coś.Co do Pythona na Twoim blogu.Ładnie go tłumaczysz.Do mnie to po prostu trafia.Mógł bym sobie życzyć abyś kontynuował serie o samym Pythonie (dla laików) ale wiem że nie samym internetem się żyje i że robisz to gratis za co dziękuję.

        • Fajnie, że działasz w Pythonie w takim ciekawym temacie. To jest właśnie fajne w nim, że można zacząć całkiem szybko „dziubać” swoje tematy.
          A przypadek ze starą chatką to świetna historia – gratuluję pomysłowości.
          Co do lekcji Pythona, to mam zrobiony spis tematów na kolejne lekcje, ale zobaczymy jak mi czas pozwoli… Dziś trudno powiedzieć. Tak czy inaczej trzymam kciuki za Twoje kodowanie w Pythonie! Powodzenia!

  • fck dla C25/30 jest 25 MPa chyba…. Chociaż zawsze mam z tym kłopot (po co te dwie próbki!), proszę sprawdzić.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *