Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

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

V predchádzajúcom cvičení, Riešené úlohy k 14. lekcii Pythonu, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V dnešnej lekcii Pythonu 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átormi, napr. čiarkou. V tomto prípade hovoríme o formáte CSV (Comma-Separated Values, teda hodnoty oddelené čiarkou). Aby sme si boli istí, že viete, o čom hovoríme, ukážme si nejaké ukážkové reťazce:

Jessie,Brown,Wall Street 10,New York 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 s troma stĺpcami a troma riadkami. Oddeľovačom stĺpcov je čiarka, riadkov bodkočiarka.

Na dátovom type 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é 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é:

message = "I already know quite a bit of Python."
x = message.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:

my_group = ("George", "Peter", "Andrea")
x = ", ".join(my_group)
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ť takto:

# the string which we want to decode
encrypted_message = ".-.. . --- -. .- .-. -.. ---"
print(f"The original message: {encrypted_message}")
# the string with a decoded message
decoded_message = ""

# array definitions
alphabet_chars = "abcdefghijklmnopqrstuvwxyz"
morse_chars = [".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
"..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
"...-", ".--", "-..-", "-.--", "--.."]

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 encrypted_message rozbijeme metódou split() na zoznam podreťazcov, obsahujúcich jednotlivé znaky morzeovky. Rozdeľovať budeme podľa znaku medzery. Zoznam si následne preiterujeme cyklom for:

# splitting the string into Morse characters
characters = encrypted_message.split(" ")

# iterating over Morse characters
for morse_char in characters:
    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 detegovať 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 morse_chars. Bude nás zaujímať jeho index, pretože keď sa pozrieme na ten istý index v zozname alphabet_chars, bude tam zodpovedajúce písmeno. To je spôsobené samozrejme tým, že aj zoznam aj reťazec obsahujú rovnaké znaky zoradené podľa abecedy. Umiestnime teda do tela cyklu nasledujúci kód:

for morse_char in characters:
    alphabet_char = "?"
    try:
        index = morse_chars.index(morse_char)
        alphabet_char = alphabet_chars[index]
        decoded_message += alphabet_char
    except ValueError: # character not found
        decoded_message += alphabet_char

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 alphabet_char znak z abecedných znakov pod týmto indexom. Nakoniec znak pripojíme k správe. Ak však kód znak v súbore morse_chars nenájde, vloží namiesto neho ?.

Operátor += nahrádza zápis decoded_message = decoded_message + alphabet_char.

Na záver samozrejme správu vypíšeme:

print(f"Decoded message: {decoded_message }")

Výstup programu:

Successfully decoded message:
The original  message: .-.. . --- -. .- .-. -.. ---
Decoded message: leonardo

Hotovo! Za úlohu si teraz skúsme naprogramovať program, ktorý naopak zakóduje reťazec do morseovky. Jeho kód bude veľmi podobný. S metódami split() a join() sa stretneme počas kurzu Python ešte niekoľkokrát.

Týmto sme v podstate ukonč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é 66x (1.43 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Python

 

Predchádzajúci článok
Riešené úlohy k 14. lekcii Pythonu
Všetky články v sekcii
Základné konštrukcie jazyka Python
Preskočiť článok
(neodporúčame)
Kvíz - Textové reťazce v Pythone
Článok pre vás napísal Vašek Doškář
Avatar
Užívateľské hodnotenie:
129 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