Word Count: počítanie slov
Čo sa naučíte
V cvičení Word Count vytvoríte funkciu, ktorá spočíta výskyty jednotlivých slov v texte a výsledok vráti ako slovník.
Pri riešení sa naučíte:
- použiť slovník ako počítadlo, teda uložiť slovo ako kľúč a počet jeho výskytov ako hodnotu,
- vytvárať novú položku v slovníku a zvyšovať hodnotu existujúcej položky,
- prechádzať text pomocou cyklu a rozdeliť ho na jednotlivé slová,
- normalizovať text tak, aby sa napríklad
You,youaYOUpočítali ako jedno slovo, - rozlišovať oddeľovače slov od apostrofu, ktorý patrí do kontrakcií ako
they'realeboit's, - pracovať s číslami zapísanými ako text, napríklad
100, - navrhnúť riešenie pre rôzne druhy interpunkcie a bielych znakov,
- čítať zadanie a testy ako presnú špecifikáciu správania funkcie.
Výsledkom nie je vypísaný text. Funkcia musí vrátiť slovník, napríklad:
word_count("Hello, hello!")
# {"hello": 2}
Čo si preštudovať
Pred riešením si preštudujte najmä tieto témy:
- Tutoriál: Slovníky
- Tutoriál: Reťazce a vstup/výstup
- premenné, priraďovanie a dátové typy
straint, - cyklus
fora podmienkuif, - funkcie, parametre a príkaz
return, - metódy reťazcov
lower(),split()astrip(), - operátor
ina práca so slovníkmi, - metódu slovníka
get()s predvolenou hodnotou, - regulárne výrazy a modul
re, ak chcete oddeľovanie slov vyriešiť všeobecne, - spúšťanie testov v Exercisme a čítanie chybových hlásení.
Užitočné kapitoly v oficiálnom Python manuáli:
Slovník ako počítadlo
Pri počítaní opakujúcich sa hodnôt potrebujete pre každé slovo vykonať jednu z dvoch operácií:
- Ak sa slovo v slovníku ešte nenachádza, vložíte ho s počtom
1. - Ak sa už nachádza, jeho počet zvýšite o
1.
Napríklad pri spracovaní slov "red red blue" má slovník postupne obsahovať:
{}
{"red": 1}
{"red": 2}
{"red": 2, "blue": 1}
Na tento účel môžete použiť podmienku:
if word in counts:
counts[word] += 1
else:
counts[word] = 1
Kratšie riešenie využíva get():
counts[word] = counts.get(word, 0) + 1
Ako rozdeliť text na slová
Jednoduché text.split() rozdelí text podľa bielych znakov, napríklad medzery, tabulátora a nového riadka. Samo však neodstráni interpunkciu, takže z textu "Hello, hello!" by mohli vzniknúť hodnoty "Hello," a "hello!". Takéto slová by sa potom nespočítali spolu.
Podľa zadania:
- slová oddeľuje ľubovoľná interpunkcia alebo biely znak,
- apostrof vnútri slova sa neodstraňuje, takže
they'reje jedno slovo, - čísla sú tiež slová,
- veľké a malé písmená nerozlišujeme,
- poradie položiek vo výslednom slovníku nie je dôležité.
Preto si pred programovaním ujasnite, aký vzor označuje platné slovo. V tomto zadaní môže slovo obsahovať písmená, číslice a apostrof. Apostrof sa má zachovať iba ako súčasť slova, nie ako samostatný znak medzi oddeľovačmi. Regulárny výraz r"[a-z0-9]+(?:'[a-z0-9]+)?" je jedna z možností, ako takéto slová nájsť v ASCII texte.
Ak regulárne výrazy ešte nepoznáte, môžete začať jednoduchším riešením pomocou split() a odstránenia okrajovej interpunkcie. Pred odovzdaním však overte najmä kontrakcie a interpunkciu umiestnenú na ich okrajoch, napríklad 'PASSWORD' alebo "word!".
Postup riešenia
- Definujte funkciu s parametrom obsahujúcim celý subtitle, napríklad
word_count(phrase). - Vytvorte prázdny slovník
counts. - Z textu získajte jednotlivé slová podľa pravidiel zadania.
- Každé slovo preveďte na malé písmená.
- Aktualizujte jeho počet v slovníku.
- Po spracovaní všetkých slov vráťte
countspomocoureturn.
Funkcia nemá používať print. Automatické testy kontrolujú hodnotu, ktorú funkcia vráti.
Príklady, ktoré otestujte
Pred odovzdaním si skúste vysvetliť výsledok týchto vstupov:
word_count("one two one")
# {"one": 2, "two": 1}
word_count("You you YOU")
# {"you": 3}
word_count("it's they're")
# {"it's": 1, "they're": 1}
word_count("That's the password: 'PASSWORD 123'!")
# {"that's": 1, "the": 1, "password": 2, "123": 1}
Zvlášť otestujte prázdny reťazec, viac medzier, tabulátor, nový riadok, slová obklopené interpunkciou a opakované čísla.