Už umíš spojovat dohromady kratší řetězce:
spojeny_retezec = 'a' + 'b'
dlouhy_retezec = 'ó' * 100
Teď se podíváme na opačný proces: jak z dlouhého řetězce dostat kratší součásti. Začneme jednotlivými znaky.
Konkrétní znak na dané pozici se z řetězce dá vybrat operací vybrání prvku (angl. subscripting), která se píše podobně jako volání funkce, jen s hranatými závorkami. Třeba takhle se dá vybrat znak na páté pozici:
pate_pismeno = 'čokoláda'[5]
print(pate_pismeno)
Funguje to? Dostala jsi opravdu páté písmeno?
Jak sis možná už všimla, programátoři počítají od nuly. „První“ prvek má vždy číslo nula, druhý číslo jedna a tak dál.
Stejně je to i se znaky v řetězcích. První písmeno má číslo nula, druhé jedna, ... a osmé písmeno má číslo sedm.
Proč je tomu tak? K úplnému pochopení důvodů by ses potřebovala naučit něco o ukazatelích a polích, což nebude hned, takže pro teď nám bude stačit vědět, že programátoři jsou prostě divní.
Nebo aspoň že mají rádi divná čísla – jako nulu.
[0] [1] [2] [3] [4] [5] [6] [7]
╭───┬───┬───┬───┬───┬───┬───┬───╮
│ Č │ o │ k │ o │ l │ á │ d │ a │
╰───┴───┴───┴───┴───┴───┴───┴───╯
A když už jsme u divných čísel, co se asi stane, když budu vybírat písmena pomocí záporných čísel?
Kromě jednotlivých znaků můžeme vybírat i delší části – odborně podřetězce (angl. substrings).
Zkus, co dělá tenhle program:
retezec = 'čokoláda'
kousek = retezec[5:]
print(kousek)
Dá se použít i retezec[:5]
,
který vybere všechno až po znak číslo 5.
Ne však znak 5 samotný, což je možná trochu zarážející,
ale je potřeba s tím počítat.
Poslední prvek není ve výběru obsažen, podobně jako range(5)
neobsahuje
číslo 5.
Ačkoli je tohle chování divné, má hezké důsledky.
Všimni si třeba, že retezec[:5] + retezec[5:]
ti dá zpět původní retezec
.
Podobnému vybírání podřetězců se říká „sekání“ řetězců (angl. string slicing).
Sekání „od“ a „do“ se dá kombinovat. Zkus si to: co asi udělají následující příkazy?
retezec = 'čokoláda'
print(retezec[:4])
print(retezec[2:6])
print(retezec[-3:])
print(retezec[:])
Určování vhodných čísel, indexů, občas vyžaduje trochu zamyšlení.
U sekání (s :
) pomáhá očíslovat si „hranice“ mezi znaky,
abys v tom měla lepší přehled:
╭───┬───┬───┬───┬───┬───┬───┬───╮
│ Č │ o │ k │ o │ l │ á │ d │ a │
├───┼───┼───┼───┼───┼───┼───┼───┤
│ │ │ │ │ │ │ │ │
0 1 2 3 4 5 6 7 8
-8 -7 -6 -5 -4 -3 -2 -1
╰───────────────╯
'čokoláda'[:4] == 'čoko'
╰───────────────╯
'čokoláda'[2:6] == 'kolá'
╰───────────╯
'čokoláda'[-3:] == 'áda'
{ "data": { "sessionMaterial": { "id": "session-material:2019/brno-podzim-pondeli:turtle:2", "title": "Výběr z řetězců", "html": "\n \n \n\n <h1>Výběr z řetězců</h1>\n<p>Už umíš spojovat dohromady kratší řetězce:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">spojeny_retezec</span> <span class=\"o\">=</span> <span class=\"s1\">'a'</span> <span class=\"o\">+</span> <span class=\"s1\">'b'</span>\n<span class=\"n\">dlouhy_retezec</span> <span class=\"o\">=</span> <span class=\"s1\">'ó'</span> <span class=\"o\">*</span> <span class=\"mi\">100</span>\n</pre></div><p>Teď se podíváme na opačný proces: jak z dlouhého\nřetězce dostat kratší součásti.\nZačneme jednotlivými znaky.</p>\n<h2>Výběr znaku</h2>\n<p>Konkrétní znak na dané pozici se z řetězce dá vybrat operací <em>vybrání prvku</em>\n(angl. <em>subscripting</em>),\nkterá se píše podobně jako volání funkce, jen s hranatými závorkami.\nTřeba takhle se dá vybrat znak na páté pozici:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">pate_pismeno</span> <span class=\"o\">=</span> <span class=\"s1\">'čokoláda'</span><span class=\"p\">[</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">pate_pismeno</span><span class=\"p\">)</span>\n</pre></div><p>Funguje to? Dostala jsi opravdu páté písmeno?</p>\n<div class=\"solution\" id=\"solution-0\">\n <h3>Řešení</h3>\n <div class=\"solution-cover\">\n <a href=\"/2019/brno-podzim-pondeli/beginners/str-index-slice/index/solutions/0/\"><span class=\"link-text\">Ukázat řešení</span></a>\n </div>\n <div class=\"solution-body\" aria-hidden=\"true\">\n <p>Nedostala – dostala jsi <em>šesté</em> písmeno.</p>\n </div>\n</div><p>Jak sis možná už všimla, programátoři počítají od nuly.\n„První“ prvek má vždy číslo nula, druhý číslo jedna a tak dál.</p>\n<p>Stejně je to i se znaky v řetězcích. První písmeno má číslo nula,\ndruhé jedna, ... a osmé písmeno má číslo sedm.</p>\n<p>Proč je tomu tak?\nK úplnému pochopení důvodů by ses potřebovala\nnaučit něco o ukazatelích a polích,\ncož nebude hned, takže pro teď nám bude\nstačit vědět,\nže programátoři jsou prostě divní.</p>\n<p>Nebo aspoň že mají rádi divná čísla – jako nulu.</p>\n<div class=\"highlight\"><pre><code> [0] [1] [2] [3] [4] [5] [6] [7]\n\n ╭───┬───┬───┬───┬───┬───┬───┬───╮\n │ Č │ o │ k │ o │ l │ á │ d │ a │\n ╰───┴───┴───┴───┴───┴───┴───┴───╯</code></pre></div><p>A když už jsme u divných čísel,\nco se asi stane, když budu vybírat písmena pomocí záporných čísel?</p>\n<div class=\"solution\" id=\"solution-1\">\n <h3>Řešení</h3>\n <div class=\"solution-cover\">\n <a href=\"/2019/brno-podzim-pondeli/beginners/str-index-slice/index/solutions/1/\"><span class=\"link-text\">Ukázat řešení</span></a>\n </div>\n <div class=\"solution-body\" aria-hidden=\"true\">\n <div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Čokoláda'</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">])</span> <span class=\"c1\"># → a</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Čokoláda'</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">2</span><span class=\"p\">])</span> <span class=\"c1\"># → d</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Čokoláda'</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">3</span><span class=\"p\">])</span> <span class=\"c1\"># → á</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Čokoláda'</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">4</span><span class=\"p\">])</span> <span class=\"c1\"># → l</span>\n</pre></div><p>Záporná čísla vybírají písmenka od konce.</p>\n<div class=\"highlight\"><pre><code> [0] [1] [2] [3] [4] [5] [6] [7]\n [-8][-7][-6][-5][-4][-3][-2][-1]\n ╭───┬───┬───┬───┬───┬───┬───┬───╮\n │ Č │ o │ k │ o │ l │ á │ d │ a │\n ╰───┴───┴───┴───┴───┴───┴───┴───╯</code></pre></div>\n </div>\n</div><h2>Sekání řetězců</h2>\n<p>Kromě jednotlivých znaků můžeme vybírat i delší části – odborně\n<em>podřetězce</em> (angl. <em>substrings</em>).</p>\n<p>Zkus, co dělá tenhle program:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">retezec</span> <span class=\"o\">=</span> <span class=\"s1\">'čokoláda'</span>\n<span class=\"n\">kousek</span> <span class=\"o\">=</span> <span class=\"n\">retezec</span><span class=\"p\">[</span><span class=\"mi\">5</span><span class=\"p\">:]</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">kousek</span><span class=\"p\">)</span>\n</pre></div><div class=\"solution\" id=\"solution-2\">\n <h3>Řešení</h3>\n <div class=\"solution-cover\">\n <a href=\"/2019/brno-podzim-pondeli/beginners/str-index-slice/index/solutions/2/\"><span class=\"link-text\">Ukázat řešení</span></a>\n </div>\n <div class=\"solution-body\" aria-hidden=\"true\">\n <p>Zápis <code>retezec[5:]</code> vybere <em>podřetězec</em> od znaku číslo 5 dál.</p>\n </div>\n</div><p>Dá se použít i <code>retezec[:5]</code>,\nkterý vybere všechno <em>až po</em> znak číslo 5.\nNe však znak 5 samotný, což je možná trochu zarážející,\nale je potřeba s tím počítat.\nPoslední prvek není ve výběru obsažen, podobně jako <code>range(5)</code> neobsahuje\nčíslo 5.</p>\n<p>Ačkoli je tohle chování divné, má hezké důsledky.\nVšimni si třeba, že <code>retezec[:5] + retezec[5:]</code> ti dá zpět původní <code>retezec</code>.</p>\n<p>Podobnému vybírání podřetězců se říká „sekání“ řetězců\n(angl. <em>string slicing</em>).</p>\n<p>Sekání „od“ a „do“ se dá kombinovat.\nZkus si to: co asi udělají následující příkazy?</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">retezec</span> <span class=\"o\">=</span> <span class=\"s1\">'čokoláda'</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">retezec</span><span class=\"p\">[:</span><span class=\"mi\">4</span><span class=\"p\">])</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">retezec</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">:</span><span class=\"mi\">6</span><span class=\"p\">])</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">retezec</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">3</span><span class=\"p\">:])</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">retezec</span><span class=\"p\">[:])</span>\n</pre></div><div class=\"solution\" id=\"solution-3\">\n <h3>Řešení</h3>\n <div class=\"solution-cover\">\n <a href=\"/2019/brno-podzim-pondeli/beginners/str-index-slice/index/solutions/3/\"><span class=\"link-text\">Ukázat řešení</span></a>\n </div>\n <div class=\"solution-body\" aria-hidden=\"true\">\n <p>Zápis <code>retezec[od:do]</code> vybere <em>podřetězec</em> od pozice <code>od</code> do pozice <code>do</code>.\nKdyž jednu z hodnot vynecháš, vybírá se od začádku, resp. do konce.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">retezec</span> <span class=\"o\">=</span> <span class=\"s1\">'čokoláda'</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">retezec</span><span class=\"p\">[:</span><span class=\"mi\">4</span><span class=\"p\">])</span> <span class=\"c1\"># → čoko</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">retezec</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">:</span><span class=\"mi\">6</span><span class=\"p\">])</span> <span class=\"c1\"># → kolá</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">retezec</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">3</span><span class=\"p\">:])</span> <span class=\"c1\"># → áda</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">retezec</span><span class=\"p\">[:])</span> <span class=\"c1\"># → čokoláda</span>\n</pre></div>\n </div>\n</div><p>Určování vhodných čísel, <em>indexů</em>, občas vyžaduje trochu zamyšlení.</p>\n<p>U sekání (s <code>:</code>) pomáhá očíslovat si „hranice“ mezi znaky,\nabys v tom měla lepší přehled:</p>\n<p><a id=\"slicing-diagram\"></a></p>\n<div class=\"highlight\"><pre><code> ╭───┬───┬───┬───┬───┬───┬───┬───╮\n │ Č │ o │ k │ o │ l │ á │ d │ a │\n ├───┼───┼───┼───┼───┼───┼───┼───┤\n │ │ │ │ │ │ │ │ │\n 0 1 2 3 4 5 6 7 8\n -8 -7 -6 -5 -4 -3 -2 -1\n\n ╰───────────────╯\n 'čokoláda'[:4] == 'čoko'\n\n ╰───────────────╯\n 'čokoláda'[2:6] == 'kolá'\n\n ╰───────────╯\n 'čokoláda'[-3:] == 'áda'</code></pre></div>\n\n\n " } } }