Menu Zamknij

Porównaj styl pisarzy część 8 – Typ danych słownik, importowanie bibliotek i funkcja Counter()

Do typów danych, które poznałeś (string, liczba, lista), dołóżmy jeszcze jeden – słownik. Dla naszych celów nie będzie potrzebna bardzo dokładna znajomość słowników, popatrzmy na podstawy.

Jak już wiesz, listy zapisujemy pomiędzy kwadratowymi nawiasami [], a kolejne elementy listy rozdzielamy przecinkami. Słowniki zapisywane są między wąsatymi (klamrowymi) nawiasami {}, każdy element słownika składa się z klucza i wartości, a para klucz wartość rozdzielana jest dwukropkiem : i kolejne elementy słownika rozdzielane są przecinkami. Napiszmy taki program, w którym utworzysz listę i słownik oraz sprawdzisz efekt działania funkcji print(), len() i type():

lista = ["oczy", "nos", "usta"]
slownik = {"oczy":"brązowe", "nos":"zadarty", "usta":"wąskie"}

print(lista)
print(len(lista))
print(type(lista))

print(slownik)
print(len(slownik))
print(type(slownik))

I zobaczmy efekt:

======================== RESTART: F:/python38/wpis 8.py ========================
['oczy', 'nos', 'usta']
3
<class 'list'>
{'oczy': 'brązowe', 'nos': 'zadarty', 'usta': 'wąskie'}
3
<class 'dict'>
>>> 

W liście już nic nie powinno cię zaskoczyć, wiesz, że ma długość 3 i jest typem 'list’. Natomiast dla słownika typem danych jest ’dict’, skrót od słowa dictionary.

Teraz spróbujmy wydrukować pierwszy element listy i pierwszy element słownika z użyciem indeksów.

lista = ["oczy", "nos", "usta"]
slownik = {"oczy":"brązowe", "nos":"zadarty", "usta":"wąskie"}

print(lista[0])
print(slownik[0])

Efekt:

======================== RESTART: F:/python38/wpis 8.py ========================
oczy
Traceback (most recent call last):
  File "F:/python38/wpis 8.py", line 5, in <module>
    print(slownik[0])
KeyError: 0
>>> 

Pierwszy element listy został wydrukowany, ale dla słownika nie da się użyć indeksu. Program zwrócił błąd KeyError: 0. Błąd ten mówi nam, że nie ma klucza o wartości 0. Słowniki, w przeciwieństwie do list, nie są uporządkowane, nie ma w nich czegoś takiego jak pierwszy element, czy też ostatni element. W nawiasie kwadratowym musisz podać prawidłowy klucz, nie prawidłowy indeks. Jeśli chcesz sprawdzić wartość dla klucza oczy. Musisz zapisać to w taki sposób:

slownik = {"oczy":"brązowe", "nos":"zadarty", "usta":"wąskie"}

print(slownik["oczy"])

Efekt będzie taki:

======================== RESTART: F:/python38/wpis 8.py ========================
brązowe

Jak już wspominałem, nie będziemy zagłębiać się mocno w słowniki, zrobisz to w zadaniu domowym. Wiedza, czym jest słownik, jest ci potrzebna, by zrozumieć jak działa i co robi funkcja Counter(). Tak, funkcja ta jest pisana z wielkiej litery. Wykorzystajmy ją do policzenia ile razy powtarzają się elementy nowej listy:

lista = ["oczy", "nos", "usta", 2, 1, 1, "nos", "nos", "ucho"]
liczba_wystapien = Counter(lista)

print(liczba_wystapien)

Zanim przeanalizujemy program, uruchom go i zobacz efekt:

======================== RESTART: F:/python38/wpis 8.py ========================
Traceback (most recent call last):
  File "F:/python38/wpis 8.py", line 2, in <module>
    liczba_wystapien = Counter(lista)
NameError: name 'Counter' is not defined

Funkcja Counter() nie znajduje się w standardowych funkcjach Pythona, ładowanych domyślnie. Dlatego wyświetlił się błąd NameError: name 'Counter’ is not defined. Musisz ją zaimportować z odpowiedniej biblioteki. Bardzo często będziesz korzystać z różnych bibliotek i różnych funkcji. Importowanie jest bardzo proste, popatrz:

from collections import Counter

lista = ["oczy", "nos", "usta", 2, 1, 1, "nos", "nos", "ucho"]
liczba_wystapien = Counter(lista)

print(liczba_wystapien)

W 1 linijce z biblioteki collections importujemy potrzebną funkcję Counter(). Skąd masz wiedzieć, z jakiej biblioteki jakiej funkcji potrzebujesz? Na to pytanie odpowie ci wyszukiwarka, np. Google. Biblioteki się zmieniają, a w zależności od problemu z jakim się borykasz będą ci potrzebne różne funkcje. W 3 linijce definiujemy zmienną lista zawierającą listę różnych elementów. W 4 linijce pod zmienną liczba_wystąpień podstawiamy efekt działania funkcji Counter(), użytej na naszej liście. W ostatniej linijce drukujemy efekt działania programu. Zobaczmy go!

======================== RESTART: F:/python38/wpis 8.py ========================
Counter({'nos': 3, 1: 2, 'oczy': 1, 'usta': 1, 2: 1, 'ucho': 1})
>>> 

Nasz program stworzył słownik, gdzie dla każdego klucza wartością jest liczba wystąpień elementu listy. Właśnie w ten sposób będziemy liczyć liczbę wystąpień trzech kolejnych wyrazów. Zanim do tego dojdziemy policzmy jakie wyrazy i z jaką częstością występują w pierwszym rozdziale Księgi Rodzaju. Napiszmy pogram, który nam to policzy:

from collections import Counter

tekst = """
1 Na początku Bóg stworzył niebo i ziemię. 2 Ziemia zaś była bezładem i pustkowiem: ciemność była nad powierzchnią bezmiaru wód, a Duch2 Boży unosił się nad wodami.
3 Wtedy Bóg rzekł: «Niechaj się stanie światłość!» I stała się światłość. 4 Bóg widząc, że światłość jest dobra, oddzielił ją od ciemności. 5 I nazwał Bóg światłość dniem, a ciemność nazwał nocą.
I tak upłynął wieczór i poranek - dzień pierwszy.
6 A potem Bóg rzekł: «Niechaj powstanie sklepienie w środku wód i niechaj ono oddzieli jedne wody od drugich!» 7 Uczyniwszy to sklepienie, Bóg oddzielił wody pod sklepieniem od wód ponad sklepieniem; a gdy tak się stało, 8 Bóg nazwał to sklepienie niebem.
I tak upłynął wieczór i poranek - dzień drugi.
9 A potem Bóg rzekł: «Niechaj zbiorą się wody spod nieba w jedno miejsce i niech się ukaże powierzchnia sucha!» A gdy tak się stało, 10 Bóg nazwał tę suchą powierzchnię ziemią, a zbiorowisko wód nazwał morzem. Bóg widząc, że były dobre, 11 rzekł: «Niechaj ziemia wyda rośliny zielone: trawy dające nasiona, drzewa owocowe rodzące na ziemi według swego gatunku owoce, w których są nasiona». I stało się tak. 12 Ziemia wydała rośliny zielone: trawę dającą nasienie według swego gatunku i drzewa rodzące owoce, w których było nasienie według ich gatunków. A Bóg widział, że były dobre.
13 I tak upłynął wieczór i poranek - dzień trzeci.
14 A potem Bóg rzekł: «Niechaj powstaną ciała niebieskie, świecące na sklepieniu nieba, aby oddzielały dzień od nocy, aby wyznaczały pory roku, dni i lata; 15 aby były ciałami jaśniejącymi na sklepieniu nieba i aby świeciły nad ziemią». I stało się tak. 16 Bóg uczynił dwa duże ciała jaśniejące: większe, aby rządziło dniem, i mniejsze, aby rządziło nocą, oraz gwiazdy. 17 I umieścił je Bóg na sklepieniu nieba, aby świeciły nad ziemią; 18 aby rządziły dniem i nocą i oddzielały światłość od ciemności. A widział Bóg, że były dobre.
19 I tak upłynął wieczór i poranek - dzień czwarty.
20 Potem Bóg rzekł: «Niechaj się zaroją wody od roju istot żywych, a ptactwo niechaj lata nad ziemią, pod sklepieniem nieba!» 21 Tak stworzył Bóg wielkie potwory morskie i wszelkiego rodzaju pływające istoty żywe, którymi zaroiły się wody, oraz wszelkie ptactwo skrzydlate różnego rodzaju. Bóg widząc, że były dobre, 22 pobłogosławił je tymi słowami: «Bądźcie płodne i mnóżcie się, abyście zapełniały wody morskie, a ptactwo niechaj się rozmnaża na ziemi».
23 I tak upłynął wieczór i poranek - dzień piąty.
24 Potem Bóg rzekł: «Niechaj ziemia wyda istoty żywe różnego rodzaju: bydło, zwierzęta pełzające i dzikie zwierzęta według ich rodzajów!» I stało się tak. 25 Bóg uczynił różne rodzaje dzikich zwierząt, bydła i wszelkich zwierząt pełzających po ziemi. I widział Bóg, że były dobre. 26 3A wreszcie rzekł Bóg: «Uczyńmy człowieka na Nasz obraz, podobnego Nam. Niech panuje nad rybami morskimi, nad ptactwem powietrznym, nad bydłem, nad ziemią i nad wszystkimi zwierzętami pełzającymi po ziemi!»
27 Stworzył więc Bóg człowieka na swój obraz,
na obraz Boży go stworzył:
stworzył mężczyznę i niewiastę.
28 Po czym Bóg im błogosławił, mówiąc do nich: «Bądźcie płodni i rozmnażajcie się, abyście zaludnili ziemię i uczynili ją sobie poddaną; abyście panowali nad rybami morskimi, nad ptactwem powietrznym i nad wszystkimi zwierzętami pełzającymi po ziemi». 29 I rzekł Bóg: «Oto wam daję wszelką roślinę przynoszącą ziarno po całej ziemi i wszelkie drzewo, którego owoc ma w sobie nasienie: dla was będą one pokarmem. 30 A dla wszelkiego zwierzęcia polnego i dla wszelkiego ptactwa w powietrzu, i dla wszystkiego, co się porusza po ziemi i ma w sobie pierwiastek życia, będzie pokarmem wszelka trawa zielona». I stało się tak. 31 A Bóg widział, że wszystko, co uczynił, było bardzo dobre.
I tak upłynął wieczór i poranek - dzień szósty.
"""
lista_slow = tekst.split()
liczba_wystapien = Counter(lista_slow)
print(liczba_wystapien)

W 1 linijce importujemy potrzebną funkcję Counter z biblioteki collections. W 3 linijce pod zmienną tekst podstawiamy cały pierwszy rozdział Księgi Rodzaju. W 22 linijce metodą split() przekształcamy tekst na listę, gdzie „rozdzielnikiem” elementów jest spacja i podstawiamy taką listę pod zmienną lista_slow. W linijce 23 używamy funkcji Counter() na zmiennej lista_slow i wynik jej działania podstawiamy pod zmienną liczba_wystapien. W ostatniej linijce drukujemy zmienną liczba_wystapien, czyli efekt działania funkcji Counter(). Zobaczmy efekt!

======================== RESTART: F:\python38\wpis 8.py ========================
Counter({'i': 29, 'Bóg': 22, 'się': 15, 'I': 15, 'nad': 13, 'tak': 8, 'A': 8, 'na': 8, 'aby': 8, 'rzekł:': 7, '«Niechaj': 7, 'że': 7, 'dzień': 7, 'w': 7, 'a': 6, 'od': 6, 'upłynął': 6, 'wieczór': 6, 'poranek': 6, '-': 6, 'były': 6, 'nazwał': 5, 'wody': 5, 'po': 5, 'według': 4, 'stało': 4, 'tak.': 4, 'dobre.': 4, 'dla': 4, 'stworzył': 3, 'widząc,': 3, 'światłość': 3, 'potem': 3, 'wód': 3, 'niechaj': 3, 'ziemi': 3, 'sklepieniu': 3, 'ptactwo': 3, 'wszelkiego': 3, 'abyście': 3, 'sobie': 3, 'Ziemia': 2, 'była': 2, 'ciemność': 2, 'Boży': 2, 'oddzielił': 2, 'ją': 2, 'ciemności.': 2, 'dniem,': 2, 'sklepienie': 2, 'to': 2, 'pod': 2, 'sklepieniem': 2, 'gdy': 2, 'stało,': 2, 'nieba': 2, 'ziemią,': 2, 'dobre,': 2, 'ziemia': 2, 'wyda': 2, 'rośliny': 2, 'zielone:': 2, 'drzewa': 2, 'rodzące': 2, 'swego': 2, 'gatunku': 2, 'owoce,': 2, 'których': 2, 'nasienie': 2, 'było': 2, 'ich': 2, 'widział,': 2, 'ciała': 2, 'nieba,': 2, 'oddzielały': 2, 'świeciły': 2, 'uczynił': 2, 'rządziło': 2, 'oraz': 2, 'je': 2, 'widział': 2, 'Bóg,': 2, 'Potem': 2, 'istoty': 2, 'wszelkie': 2, 'różnego': 2, '«Bądźcie': 2, 'się,': 2, 'ziemi».': 2, 'zwierzęta': 2, 'rzekł': 2, 'Bóg:': 2, 'człowieka': 2, 'obraz,': 2, 'rybami': 2, 'morskimi,': 2, 'ptactwem': 2, 'wszystkimi': 2, 'zwierzętami': 2, 'pełzającymi': 2, 'ma': 2, 'co': 2, '1': 1, 'Na': 1, 'początku': 1, 'niebo': 1, 'ziemię.': 1, '2': 1, 'zaś': 1, 'bezładem': 1, 'pustkowiem:': 1, 'powierzchnią': 1, 'bezmiaru': 1, 'wód,': 1, 'Duch2': 1, 'unosił': 1, 'wodami.': 1, '3': 1, 'Wtedy': 1, 'stanie': 1, 'światłość!»': 1, 'stała': 1, 'światłość.': 1, '4': 1, 'jest': 1, 'dobra,': 1, '5': 1, 'nocą.': 1, 'pierwszy.': 1, '6': 1, 'powstanie': 1, 'środku': 1, 'ono': 1, 'oddzieli': 1, 'jedne': 1, 'drugich!»': 1, '7': 1, 'Uczyniwszy': 1, 'sklepienie,': 1, 'ponad': 1, 'sklepieniem;': 1, '8': 1, 'niebem.': 1, 'drugi.': 1, '9': 1, 'zbiorą': 1, 'spod': 1, 'jedno': 1, 'miejsce': 1, 'niech': 1, 'ukaże': 1, 'powierzchnia': 1, 'sucha!»': 1, '10': 1, 'tę': 1, 'suchą': 1, 'powierzchnię': 1, 'zbiorowisko': 1, 'morzem.': 1, '11': 1, 'trawy': 1, 'dające': 1, 'nasiona,': 1, 'owocowe': 1, 'są': 1, 'nasiona».': 1, '12': 1, 'wydała': 1, 'trawę': 1, 'dającą': 1, 'gatunków.': 1, '13': 1, 'trzeci.': 1, '14': 1, 'powstaną': 1, 'niebieskie,': 1, 'świecące': 1, 'nocy,': 1, 'wyznaczały': 1, 'pory': 1, 'roku,': 1, 'dni': 1, 'lata;': 1, '15': 1, 'ciałami': 1, 'jaśniejącymi': 1, 'ziemią».': 1, '16': 1, 'dwa': 1, 'duże': 1, 'jaśniejące:': 1, 'większe,': 1, 'mniejsze,': 1, 'nocą,': 1, 'gwiazdy.': 1, '17': 1, 'umieścił': 1, 'ziemią;': 1, '18': 1, 'rządziły': 1, 'dniem': 1, 'nocą': 1, '19': 1, 'czwarty.': 1, '20': 1, 'zaroją': 1, 'roju': 1, 'istot': 1, 'żywych,': 1, 'lata': 1, 'nieba!»': 1, '21': 1, 'Tak': 1, 'wielkie': 1, 'potwory': 1, 'morskie': 1, 'rodzaju': 1, 'pływające': 1, 'żywe,': 1, 'którymi': 1, 'zaroiły': 1, 'wody,': 1, 'skrzydlate': 1, 'rodzaju.': 1, '22': 1, 'pobłogosławił': 1, 'tymi': 1, 'słowami:': 1, 'płodne': 1, 'mnóżcie': 1, 'zapełniały': 1, 'morskie,': 1, 'rozmnaża': 1, '23': 1, 'piąty.': 1, '24': 1, 'żywe': 1, 'rodzaju:': 1, 'bydło,': 1, 'pełzające': 1, 'dzikie': 1, 'rodzajów!»': 1, '25': 1, 'różne': 1, 'rodzaje': 1, 'dzikich': 1, 'zwierząt,': 1, 'bydła': 1, 'wszelkich': 1, 'zwierząt': 1, 'pełzających': 1, 'ziemi.': 1, '26': 1, '3A': 1, 'wreszcie': 1, '«Uczyńmy': 1, 'Nasz': 1, 'podobnego': 1, 'Nam.': 1, 'Niech': 1, 'panuje': 1, 'powietrznym,': 1, 'bydłem,': 1, 'ziemią': 1, 'ziemi!»': 1, '27': 1, 'Stworzył': 1, 'więc': 1, 'swój': 1, 'obraz': 1, 'go': 1, 'stworzył:': 1, 'mężczyznę': 1, 'niewiastę.': 1, '28': 1, 'Po': 1, 'czym': 1, 'im': 1, 'błogosławił,': 1, 'mówiąc': 1, 'do': 1, 'nich:': 1, 'płodni': 1, 'rozmnażajcie': 1, 'zaludnili': 1, 'ziemię': 1, 'uczynili': 1, 'poddaną;': 1, 'panowali': 1, 'powietrznym': 1, '29': 1, '«Oto': 1, 'wam': 1, 'daję': 1, 'wszelką': 1, 'roślinę': 1, 'przynoszącą': 1, 'ziarno': 1, 'całej': 1, 'drzewo,': 1, 'którego': 1, 'owoc': 1, 'nasienie:': 1, 'was': 1, 'będą': 1, 'one': 1, 'pokarmem.': 1, '30': 1, 'zwierzęcia': 1, 'polnego': 1, 'ptactwa': 1, 'powietrzu,': 1, 'wszystkiego,': 1, 'porusza': 1, 'pierwiastek': 1, 'życia,': 1, 'będzie': 1, 'pokarmem': 1, 'wszelka': 1, 'trawa': 1, 'zielona».': 1, '31': 1, 'wszystko,': 1, 'uczynił,': 1, 'bardzo': 1, 'szósty.': 1})
>>> 

Kilka rzeczy nie do końca jest takich, jakie chcielibyśmy. Spójrz na słowo Bóg. Według Counter() występuje ono 22 razy, w rozdziale 5 słowo to znaleźliśmy 26 razy. Co poszło nie tak? Jeśli przyjrzysz się dokładnie zobaczysz, że słowo „Bóg” występuje 22 razy, „Bóg,” 2 razy i „Bóg:” 2 razy. W sumie 22+2+2 = 26. Zwróć uwagę też na taki przykład, słowo „i” występuje 29 razy, a słowo „I” 15 razy. Wszystko, co nie jest literami, do naszej analizy jest zupełnie niepotrzebne, podobnie rozróżnienie na małe i wielkie litery nie jest nam potrzebne. W następnej lekcji pokażę, jak pozbyć się ze stringa znaków przeszkadzających w naszym zadaniu.

Zadanie domowe

Podążanie za instrukcjami, nawet jeśli je wszystkie wykonujesz samodzielnie, nie zrobi z ciebie programisty. Zadania domowe mogą wydawać się na początku trudne. Tu nie ma rozwiązania podanego na talerzu, użyj dowolnych źródeł, by znaleźć odpowiedź.

  1. Używając odpowiedniej metody wraz z funkcją Counter(), wydrukuj tylko klucze słownika powstałe z dowolnej listy, następnie wydrukuj tylko wartości słownika.
  2. Argumentami funkcji Counter() mogą być pary klucz i wartość. Podaj takie argumenty, by wydrukowanie dało taki efekt: Counter({'Ala': 3, 'Beata': 2, 'Celina': 1})
0 0 votes
Ocena artykułu

2 komentarzy
Most Voted
Newest Oldest
Inline Feedbacks
View all comments

Czy w punkcie 1. zadania domowego nie powinny być klucze i wartości słownika, a nie listy?

2
0
Chcesz podzielić się komentarzem?x