Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

10. diel - Textové reťazce v Pythone do tretice - Split a Join

V tomto tutoriále základov programovania v Pythone 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.

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 v súboroch TXT a XML. Veľmi často máme zadaný jeden dlhší reťazec (riadok súboru alebo riadok konzoly), v ktorom je viac hodnôt. Tie sú byť oddelené tzv. separátormi, napr. čiarkou. V tomto prípade hovoríme o formáte CSV (C omma- S 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)
  • Prvý reťazec je očividne nejaký používateľ, takto by sme mohli napr. realizovať uloženie používateľov do CSV súboru, každý na jeden riadok.
  • Druhý reťazec sú znaky Morseovej abecedy, separátor (oddeľovač) je tu medzera.
  • Tretí reťazec je matica s 3 stĺpcami a 3 riadkami. Oddeľovač stĺpcov je čiarka, riadkov bodkočiarka.
Na dátovom type str môžeme volať metódu split(), ktorá berie ako parameter separátor (typu str), prípadne dokonca sekvenciu separátorov. 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 sekvenciu. Výstupom metódy je výsledný reťazec. Uveďme si príklad:

mojeParta = ("Jirka", "Petr", "Andrea")
x = ", ".join(mojeParta)
print(x)

Keďže zatiaľ nevieme tvoriť objekty (užívateľa) a ani pracovať s viacrozmernými sekvenciami (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 samotného typu str, pretože majú len jeden znak. Znaky Morseovej abecedy majú už znakov viac, tie musíme dať do sekvencie.

Štruktúra nášho programu bude teraz vyzerať nasledovne:

# řetězec, který chceme dekódovat
s = ".-.. . --- -. .- .-. -.. ---"
print("Původní zpráva: %s" % s)
# řetězec s dekódovanou zprávou
zprava = ""

# vzorová sekvence
abecedniZnaky = "abcdefghijklmnopqrstuvwxyz"
morseovyZnaky = [".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
"..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
"...-", ".--", "-..-", "-.--", "--.."]

Ponúka sa potom pridať ďalšie znaky ako čísla a interpunkčné znamienka, my ich tu však pre jednoduchosť vynecháme.

Rozdelenie reťazca na zoznam metódou split()

Teraz si reťazec s rozbijeme metódou split() na zoznam podreťazcov, obsahujúcich jednotlivé znaky morzeovky. Splitovať budeme podľa znaku medzery. Zoznam si následne proiterujeme cyklom for:

# rozbití řetězce na znaky morseovky
znaky = s.split(" ")

# iterace znaky morzeovky
for morseuvZnak in znaky:

V cykle sa pokúsime nájsť aktuálne čítaný znak morseovky v zozname morseovyZnaky. Bude nás zaujímať jeho index, pretože keď sa pozrieme na ten istý index v zozname abecedniZnaky, bude tam zodpovedajúce písmeno. To je samozrejme z toho dôvodu, že zoznam aj reťazec obsahujú rovnaké znaky zoradené podľa abecedy. Umiestnime teda do tela cyklu nasledujúci kód:

abecedniZnak = "?"
index = morseovyZnaky.index(morseuvZnak)
if (index >= 0): # znak nalezen
    abecedniZnak = abecedniZnaky[index]
zprava += abecedniZnak

Kód najskôr do abecedného znaku uloží "?", pretože sa môže stať, že znak v našej sade nemáme. Následne sa pokúsime zistiť jeho index. Pokiaľ sa to podarí, dosadíme do abecedniZnak znak z abecedných znakov pod týmto indexom. Nakoniec znak pripojíme k správe. Operátor += nahrádza zprava = zprava + abecedniZnak.

V ideálnom prípade by sme sa mali nejako vysporiadať s prípadmi, keď používateľ zadá napríklad viac medzier medzi znakmi (čo používatelia robia celkom často). V tomto prípade funkcia split() vytvorí v sekvencii ešte jeden prázdny podreťazec. Potom by sme to v slučke detekovali a ignorovali.

Dokončenie

Teraz si poďme vytlačiť našu dekódovanú správu:

# řetězec, který chceme dekódovat
s = ".-.. . --- -. .- .-. -.. ---"
print("Původní zpráva: %s" % s)
# řetězec s dekódovanou zprávou
zprava = ""

# vzorové seznamy
abecedniZnaky = "abcdefghijklmnopqrstuvwxyz"
morseovyZnaky = [".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
"..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
"...-", ".--", "-..-", "-.--", "--.."]

# rozbití řetězce na znaky morzeovky
znaky = s.split(" ")

# iterace znaky morzeovky
for morseuvZnak  in znaky:
    abecedniZnak = "?"
    index = morseovyZnaky.index(morseuvZnak)
    if (index >= 0): # znak nalezen
        abecedniZnak = abecedniZnaky[index]
    zprava += abecedniZnak
print("Dekódovaná zpráva je: %s" % zprava)

Vo výstupe vidíme, že program správne preložil z morzeovky zadané slovo:

Konzolová aplikácia
Původní zpráva: .-.. . --- -. .- .-. -.. ---
Dekódovaná zpráva je: leonardo

Kód je k dispozícii pod lekciou.

V nasledujúcom kvíze, Kvíz - Základná konštrukcia Python, si vyskúšame nadobudnuté skúsenosti z kurzu.


 

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é 188x (1.29 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Python

 

Predchádzajúci článok
Knižnice math a random
Všetky články v sekcii
Základné konštrukcie jazyka Python
Preskočiť článok
(neodporúčame)
Kvíz - Základná konštrukcia Python
Článok pre vás napísal Vašek Doškář
Avatar
Užívateľské hodnotenie:
1 hlasov
Autor pracuje jako pedagog v oblasti elektroniky, elektrotechniky a programování. Rád tvoří appky všeho druhu. Má přehled v jazycích C#, Java, Kotlin, Javascript, Python a Rust
Aktivity