14. diel - Textové reťazce v Pythone do tretice - Split a Join
V predchádzajúcom cvičení, Riešené úlohy k 13. lekcii Pythonu, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V dnešnom Python tutoriále nadviažeme na predchádzajúce lekcie, v
ktorých sme sa naučili zaobchádzať s reťazcami ako so sekvenciami znakov.
Ukážeme si metódy split()
a join()
. Vďaka nim si
potom budeme môcť vytvoriť program na kódovanie a dekódovanie Morseovej
abecedy.
Metódy split()
a
join()
Z predchádzajúcich tutoriálov vieme, že parsovanie reťazca po znaku môže byť niekedy celkom zložité. S reťazcami sa samozrejme budeme stretávať stále, a to ako na vstupe od užívateľa (napr. z konzoly alebo zo sekvencií vo formulárových aplikáciách), tak aj pri práci so súbormi. Veľmi často máme zadaný jeden dlhší reťazec (riadok súboru alebo riadok konzoly), v ktorom je viac hodnôt. Tie sú oddelené tzv. separátory, napr. čiarkou. V tomto prípade hovoríme o formáte CSV (C ommas eparated v alues, teda hodnoty oddelené čiarkou). Aby sme si boli istí, že vieme, o čom hovoríme, ukážme si nejaké ukážkové reťazce:
Jan, Novák, Dlouhá 10, Praha 3,130 00 .. ... .-.. .- -. -.. ... --- ..-. - (1,2,3;4,5,6;7,8,9)
Význam jednotlivých reťazcov:
- Prvý reťazec je očividne nejaký používateľ. Takto by sme mohli realizovať napr. uloženie užívateľov do CSV súboru, každý na jeden riadok.
- Druhý reťazec sú znaky Morseovej abecedy, separátorom (oddeľovačom) je tu medzera.
- Tretí reťazec je matica o troch stĺpcoch a troch riadkoch. Oddeľovačom stĺpcov je čiarka, riadkov bodkočiarkou.
str
môžeme volať metódu split()
,
ktorá berie ako parameter separátor. Metóda následne pôvodný reťazec
rozdelí podľa separátorov na sekvenciu podreťazcov, ktorých vráti.
Defaultným separátorom je medzera. To nám veľmi uľahčí prácu pri
rozdeľovaní hodnôt v reťazci. Z príkladu je to zrejmé:
zprava = "Už toho v Pythonu umím docela dost."
x = zprava.split()
print(x)
Metóda join()
sa volá priamo na type str
a
umožňuje nám naopak sekvenciu podreťazcov spojiť oddeľovačom do jediného
reťazca. Parametre sú oddeľovač a sekvencie. Výstupom metódy je výsledný
reťazec. Uveďme si príklad:
moje_parta = ("Jirka", "Petr", "Andrea")
x = ", ".join(moje_parta)
print(x)
Keďže zatiaľ nevieme tvoriť objekty (užívateľa) ani pracovať s viacrozmernými zoznamami (matice), skúsime si naprogramovať dekodér správ z Morseovej abecedy.
Dekodér Morseovej abecedy
Poďme si opäť pripraviť štruktúru programu. Budeme potrebovať dva reťazce so správou, jeden so správou v Morseovej abecede, druhý zatiaľ prázdny, do ktorého budeme ukladať výsledok nášho snaženia. Ďalej budeme ako v prípade samohlások potrebovať nejaký vzor písmen. K písmenám budeme musieť priradiť vzor ich znaku v morseovke. Písmená môžeme opäť uložiť do obyčajného reťazca, pretože majú len jeden znak. Symboly Morseovej abecedy majú už znakov viac, preto ich musíme dať do zoznamu. Štruktúra nášho programu bude teraz vyzerať nasledovne:
# řetězec, který chceme dekódovat sifrovana_zprava = ".-.. . --- -. .- .-. -.. ---" print(f"Pôvodná správa: {sifrovana_zprava}") # řetězec s dekódovanou zprávou zprava = "" # vzorová sekvence abecedni_znaky = "abcdefghijklmnopqrstuvwxyz" morseovy_znaky = [".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."]
Môžeme samozrejme pridať aj ďalšie znaky ako čísla či interpunkčné znamienka, my ich tu však vynecháme.
Teraz si reťazec sifrovana_zprava
rozbijeme metódou
split()
na zoznam podreťazcov, obsahujúcich jednotlivé znaky
morzeovky. Rozdeľovať budeme podľa znaku medzery. Zoznam si následne
proiterujeme cyklom for
:
# rozbití řetězce na znaky morseovky znaky = sifrovana_zprava.split(" ") # iterace znaky morseovky for morseuv_znak in znaky: pass
Ideálne by sme sa mali nejako vysporiadať s prípadmi, keď používateľ
zadá napr. viac medzier medzi znakmi (to používatelia robia radi). Metóda
split()
potom vytvorí o jeden reťazec v poli viac, ktorý bude
prázdny. Ten by sme mali potom v cykle detekovať a ignorovať. My sa tým
však v tomto tutoriáli zaoberať nebudeme.
V cykle sa pokúsime nájsť aktuálne čítaný znak morseovky v zozname
morseovy_znaky
. Bude nás zaujímať jeho index, pretože keď sa
pozrieme na ten istý index v zozname abecedni_znaky
, bude tam
zodpovedajúce písmeno. To je spôsobené samozrejme tým, že tak zoznam, ako
aj reťazec obsahujú rovnaké znaky zoradené podľa abecedy. Umiestnime teda
do tela cyklu nasledujúci kód:
for morseuv_znak in znaky: abecedni_znak = "?" try: index = morseovy_znaky.index(morseuv_znak) abecedni_znak = abecedni_znaky[index] zprava += abecedni_znak except ValueError: # znak nenalezen zprava += abecedni_znak
Kód najskôr do abecedného znaku uloží znak ?
, pretože sa
môže stať, že znak v našej sade nemáme. Následne sa pokúsime zistiť
jeho index. Ak sa to podarí, dosadíme do premennej abecedniZnak
znak z abecedných znakov pod týmto indexom. Nakoniec znak pripojíme k
správe. Ak však kód znak v sade morseovyZnaky
nenájde, vloží
namiesto neho ?
.
Operátor +=
nahrádza zápis
zprava = zprava + abecedniZnak
.
Na záver samozrejme správu vypíšeme:
# řetězec, který chceme dekódovat
sifrovana_zprava = ".-.. . --- -. .- .-. -.. ---"
print(f"Pôvodná správa: {sifrovana_zprava}")
# řetězec s dekódovanou zprávou
zprava = ""
# vzorové seznamy
abecedni_znaky = "abcdefghijklmnopqrstuvwxyz"
morseovy_znaky = [".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
"..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
"...-", ".--", "-..-", "-.--", "--.."]
# rozbití řetězce na znaky morseovky
znaky = sifrovana_zprava.split(" ")
# iterace znaky morseovky
for morseuv_znak in znaky:
abecedni_znak = "?"
try:
index = morseovy_znaky.index(morseuv_znak)
abecedni_znak = abecedni_znaky[index]
zprava += abecedni_znak
except ValueError: # znak nenalezen
zprava += abecedni_znak
print(f"Dekódovaná zpráva je: {zprava}")
Výstup programu:
Úspěšně dekódovaná zpráva:
Původní zpráva: .-.. . --- -. .- .-. -.. ---
Dekódovaná zpráva je: leonardo
Hotovo! Za úlohu si teraz skúsme naprogramovať program, ktorý naopak
zakóduje reťazec do morzeovky. Jeho kód bude veľmi podobný. S metódami
split()
a join()
sa stretneme počas Python kurzu
ešte niekoľkokrát.
Týmto sme v podstate zakončili kurz so základnou štruktúrou jazyka Python. V nasledujúcich lekciách si uvedieme viacrozmerné polia a matematické operácie. Zo základných konštrukcií jazyka nás tu ale už nič neprekvapí:) V podstate by sme sa už mohli pokojne venovať aj objektom. Odporúčame však zvyšné tutoriály tiež prejsť, jedná sa predsa len stále o základné znalosti, ktoré by sme mali mať.
V nasledujúcom kvíze, Kvíz - Textové reťazce v Pythone, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 225x (1.29 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Python