Sekvence (Sequence)

Jednou ze základních datových struktur v Pythonu je posloupnost (sekvence). Každému elementu v sekvenci je přiřazeno číslo, jeho index (pozice). První číslo je nula, druhé je jednička atd.

Dnes si povíme něco o sekvencích a také, jaké operace s nimi můžeme dělat. Popíšeme si některé operace, které můžeme dělat nad všemi sekvencemi, včetně seznamů a n-tic. Tyto operace fungují také s řetězci, o těch bude ale až příští lekce.

Přehled sekvencí

Python má několik základních typů sekvencí. Mezi nejpoužívanější patří seznamy a n-tice.

Rozdíl mezi seznamy a n-ticemi je v tom, že seznamy lze měnit, zatímco n-tice ne. Proto se seznamy a n-tice používají pro jiné účely. Zatímco seznamy se používají tam, kde je vhodné nebo nutné měnit obsah nebo počet prvků v datové struktuře, n-tice se používá tam, kde je nopak žádoucí takové chování znemožnot.

Sekvence se používají tam, kde potřebujete vytvořit seznam hodnot. Můžete například vytvořit sekvenci, která obsahuje osobu v databázi, jako je na následujícím příkladu:

>>> john_doe = ['John Doe', 40]
>>> peter_smith = ['Peter Smith', 50]
>>> database = [john_doe, peter_smith]
>>> database
[['John Doe', 40], ['Peter Smith', 50]]

Operace nad sekvencemi

Některé operace můžete provádět nad všemi sekvencemi. Mezi tyto operace patří indexing, slicing, adding, multiplying a kontrola členství. Python také má vestavěné funkce pro zjištění délky sekvence a nalezení největšího a nejmenšího prvku.

Indexování (Indexing)

Pamatujete, že řetězce jsou také sekvencemi? Můžeme použít příklad s řetězcem a ukázat si na něm indexování v praxi:

>>> greeting = 'Hello'
>>> greeting[0]
'H'

Jak vidíte, řetězec je jen sekvence znaků. Můžete přistupovat k jednotlivým prvkům pole pomocí indexu, který začíná nulou a končí -1. Přistoupit k poslední pozici v sekvenci proto můžeme takto:

>>> greeting[-1]
'o'

Vyzkoušejte přistoupit k prvku přímo, bez použití proměnné

>>> 'Hello'[1]
'e'

Také, pokud funkce vrací sekvenci, můžete přistoupit k hodnotě přímo:

>>> fourth = input('Year: ')[3]
Year: 2005
>>> fourth
'5'

Řez (Slicing)

Kromě toho, že můžete přistupovat k jednotlivým prvkům sekvence, můžete použít řez seznamem (slicing) a získat podmnožinu prvků. Abyste toho docílili, musíte použít místo jednoho dva indexy oddělené dvojtečkou.

>>> tag = '<a href="http://www.python.org">Python web site</a>'
>>> tag[9:30]
'http://www.python.org'
>>> tag[32:-4]
'Python web site'

První index je číslo indexu prvního prvku, který chcete zahrnout. Ale druhý index je číslo prvku v sekvenci za vaším řezem.

>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[3:6]
[4, 5, 6]
>>> numbers[0:1]
[1]

Další příklady:

>>> numbers[7:10]
[8, 9, 10]

Index č.10 (jedenáctý prvek pole) odkazuje na neexistující prvek pole. Proto můžem místo toho použít následující zápis pomocí negativní notace:

>>> numbers[-3:-1]
[8, 9]

Pokud zkusíme toto, nebude to fungovat, tak jak očekáváme:

>>> numbers[-3:0]
[]

Proto místo toho musíme použít tento zápis:

>>> numbers[-3:]
[8, 9, 10]

Totéž můžeme udělat v opačném směru:

>>> numbers[:3]
[1, 2, 3]

A pomocí následující syntaxe můžeme zkopírovat celou sekvenci (její hodnoty), například do jiné proměnné:

>>> numbers[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Prosím vyzkoušejte si, jaký je rozdíl mezí následujícími příklady:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
copy_numbers_variable = numbers
slicing_numbers = numbers[:]

Příjdete na to?

Další možná ukázka slicingu je másledující:

url = input('Please enter the URL:')
domain = url[11:-4]

print("Domain name: " + domain)
Please enter the URL: http://www.python.org
Domain name: python

Řez po krocích

Jako volitelný parametr můžete použít délku kroku, kterým chcete řez vytvořit:

>>> numbers[0:10:1]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[0:10:2]
[1, 3, 5, 7, 9]

Slučování sekvencí

Sekvence mohou být slučovány pomocí znaku plus.

>>> [1, 2, 3] + [4, 5,  6]
[1, 2, 3, 4, 5, 6]
>>> 'Hello,' + 'world!'
'Hello, world!'

Multiplikační operátor

>>> z = [3, 1] * 2
>>> z
[3, 1, 3, 1]

Pokud byste chtěli vytvořit prázdný seznam s místem pro tři prvky, můžete to udělat takto:

>>> s = [None] * 3
>>> s
[None, None, None]

Zjištění prvku v sekvenci (Membership)

Abychom zjistili, zda je nějaký prvek prkem sekvence, použijeme operátor in. Tento operátor ověřuje, zda je něco pravdivé nebo ne a podle toho vrací návratovou hodnotu True/False.

True a False jsou tzv. logické operátory

>>> 3 in [1, 2, 3, 4, 5]
True
>>> 3 not in [1, 2, 3, 4, 5]
False
>>> 'P' in 'Python'
True

Délka sekvence, nalezení minima a maxima

>>> numbers = [100, 34, 678]
>>> len(numbers)
3
>>> max(numbers)
678
>>> min(numbers)
34
>>> max(2, 3)
3
>>> min(9, 3, 2, 5)
2
{
  "data": {
    "sessionMaterial": {
      "id": "session-material:2018/tieto:lists-and-tupples:0",
      "title": "Sekvence (Sequence)",
      "html": "\n          \n    \n\n    <h2>Sekvence (Sequence)</h2>\n<p>Jednou ze z&#xE1;kladn&#xED;ch <em>datov&#xFD;ch struktur</em> v Pythonu je posloupnost (sekvence). Ka&#x17E;d&#xE9;mu elementu v sekvenci je p&#x159;i&#x159;azeno &#x10D;&#xED;slo, jeho index (pozice). Prvn&#xED; &#x10D;&#xED;slo je nula, druh&#xE9; je jedni&#x10D;ka atd.</p>\n<p>Dnes si pov&#xED;me n&#x11B;co o sekvenc&#xED;ch a tak&#xE9;, jak&#xE9; operace s nimi m&#x16F;&#x17E;eme d&#x11B;lat. Pop&#xED;&#x161;eme si n&#x11B;kter&#xE9; operace, kter&#xE9; m&#x16F;&#x17E;eme d&#x11B;lat nad v&#x161;emi sekvencemi, v&#x10D;etn&#x11B; seznam&#x16F; a n-tic. Tyto operace funguj&#xED; tak&#xE9; s &#x159;et&#x11B;zci, o t&#x11B;ch bude ale a&#x17E; p&#x159;&#xED;&#x161;t&#xED; lekce.</p>\n<h3>P&#x159;ehled sekvenc&#xED;</h3>\n<p>Python m&#xE1; n&#x11B;kolik z&#xE1;kladn&#xED;ch typ&#x16F; sekvenc&#xED;. Mezi nejpou&#x17E;&#xED;van&#x11B;j&#x161;&#xED; pat&#x159;&#xED; seznamy a n-tice.</p>\n<p>Rozd&#xED;l mezi seznamy a n-ticemi je v tom, &#x17E;e seznamy lze m&#x11B;nit, zat&#xED;mco n-tice ne. Proto se seznamy a n-tice pou&#x17E;&#xED;vaj&#xED; pro jin&#xE9; &#xFA;&#x10D;ely. Zat&#xED;mco seznamy se pou&#x17E;&#xED;vaj&#xED; tam, kde je vhodn&#xE9; nebo nutn&#xE9; m&#x11B;nit obsah nebo po&#x10D;et prvk&#x16F; v datov&#xE9; struktu&#x159;e, n-tice se pou&#x17E;&#xED;v&#xE1; tam, kde je nopak &#x17E;&#xE1;douc&#xED; takov&#xE9; chov&#xE1;n&#xED; znemo&#x17E;not.</p>\n<p>Sekvence se pou&#x17E;&#xED;vaj&#xED; tam, kde pot&#x159;ebujete vytvo&#x159;it seznam hodnot. M&#x16F;&#x17E;ete nap&#x159;&#xED;klad vytvo&#x159;it sekvenci, kter&#xE1; obsahuje osobu v datab&#xE1;zi, jako je na n&#xE1;sleduj&#xED;c&#xED;m p&#x159;&#xED;kladu:</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; john_doe = [&apos;John Doe&apos;, 40]\n&gt;&gt;&gt; peter_smith = [&apos;Peter Smith&apos;, 50]\n&gt;&gt;&gt; database = [john_doe, peter_smith]\n&gt;&gt;&gt; database\n[[&apos;John Doe&apos;, 40], [&apos;Peter Smith&apos;, 50]]</code></pre></div><h3>Operace nad sekvencemi</h3>\n<p>N&#x11B;kter&#xE9; operace m&#x16F;&#x17E;ete prov&#xE1;d&#x11B;t nad v&#x161;emi sekvencemi. Mezi tyto operace pat&#x159;&#xED; <em>indexing</em>, <em>slicing</em>, <em>adding</em>, <em>multiplying</em> a kontrola &#x10D;lenstv&#xED;. Python tak&#xE9; m&#xE1; vestav&#x11B;n&#xE9; funkce pro zji&#x161;t&#x11B;n&#xED; d&#xE9;lky sekvence a nalezen&#xED; nejv&#x11B;t&#x161;&#xED;ho a nejmen&#x161;&#xED;ho prvku.</p>\n<h4>Indexov&#xE1;n&#xED; (Indexing)</h4>\n<p>Pamatujete, &#x17E;e &#x159;et&#x11B;zce jsou tak&#xE9; sekvencemi? M&#x16F;&#x17E;eme pou&#x17E;&#xED;t p&#x159;&#xED;klad s &#x159;et&#x11B;zcem a uk&#xE1;zat si na n&#x11B;m indexov&#xE1;n&#xED; v praxi:</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; greeting = &apos;Hello&apos;\n&gt;&gt;&gt; greeting[0]\n&apos;H&apos;</code></pre></div><p>Jak vid&#xED;te, &#x159;et&#x11B;zec je jen sekvence znak&#x16F;. M&#x16F;&#x17E;ete p&#x159;istupovat k jednotliv&#xFD;m prvk&#x16F;m pole pomoc&#xED; indexu, kter&#xFD; za&#x10D;&#xED;n&#xE1; nulou a kon&#x10D;&#xED; <em>-1</em>. P&#x159;istoupit k posledn&#xED; pozici v sekvenci proto m&#x16F;&#x17E;eme takto:</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; greeting[-1]\n&apos;o&apos;</code></pre></div><div class=\"admonition note\"><p>Vyzkou&#x161;ejte p&#x159;istoupit k prvku p&#x159;&#xED;mo, bez pou&#x17E;it&#xED; prom&#x11B;nn&#xE9;</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; &apos;Hello&apos;[1]\n&apos;e&apos;</code></pre></div></div><p>Tak&#xE9;, pokud funkce vrac&#xED; sekvenci, m&#x16F;&#x17E;ete p&#x159;istoupit k hodnot&#x11B; p&#x159;&#xED;mo:</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; fourth = input(&apos;Year: &apos;)[3]\nYear: 2005\n&gt;&gt;&gt; fourth\n&apos;5&apos;</code></pre></div><h4>&#x158;ez (Slicing)</h4>\n<p>Krom&#x11B; toho, &#x17E;e m&#x16F;&#x17E;ete p&#x159;istupovat k jednotliv&#xFD;m prvk&#x16F;m sekvence, m&#x16F;&#x17E;ete pou&#x17E;&#xED;t &#x159;ez seznamem (slicing) a z&#xED;skat podmno&#x17E;inu prvk&#x16F;. Abyste toho doc&#xED;lili, mus&#xED;te pou&#x17E;&#xED;t m&#xED;sto jednoho dva indexy odd&#x11B;len&#xE9; dvojte&#x10D;kou.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; tag = &apos;&lt;a href=&quot;http://www.python.org&quot;&gt;Python web site&lt;/a&gt;&apos;\n&gt;&gt;&gt; tag[9:30]\n&apos;http://www.python.org&apos;\n&gt;&gt;&gt; tag[32:-4]\n&apos;Python web site&apos;</code></pre></div><p>Prvn&#xED; index je &#x10D;&#xED;slo indexu prvn&#xED;ho prvku, kter&#xFD; chcete zahrnout. Ale druh&#xFD; index je &#x10D;&#xED;slo prvku v sekvenci <em>za</em> va&#x161;&#xED;m &#x159;ezem.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n&gt;&gt;&gt; numbers[3:6]\n[4, 5, 6]\n&gt;&gt;&gt; numbers[0:1]\n[1]</code></pre></div><p>Dal&#x161;&#xED; p&#x159;&#xED;klady:</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; numbers[7:10]\n[8, 9, 10]</code></pre></div><p>Index &#x10D;.10 (jeden&#xE1;ct&#xFD; prvek pole) odkazuje na neexistuj&#xED;c&#xED; prvek pole. Proto m&#x16F;&#x17E;em m&#xED;sto toho pou&#x17E;&#xED;t n&#xE1;sleduj&#xED;c&#xED; z&#xE1;pis pomoc&#xED; negativn&#xED; notace:</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; numbers[-3:-1]\n[8, 9]</code></pre></div><p>Pokud zkus&#xED;me toto, nebude to fungovat, tak jak o&#x10D;ek&#xE1;v&#xE1;me:</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; numbers[-3:0]\n[]</code></pre></div><p>Proto m&#xED;sto toho mus&#xED;me pou&#x17E;&#xED;t tento z&#xE1;pis:</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; numbers[-3:]\n[8, 9, 10]</code></pre></div><p>Tot&#xE9;&#x17E; m&#x16F;&#x17E;eme ud&#x11B;lat v opa&#x10D;n&#xE9;m sm&#x11B;ru:</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; numbers[:3]\n[1, 2, 3]</code></pre></div><p>A pomoc&#xED; n&#xE1;sleduj&#xED;c&#xED; syntaxe m&#x16F;&#x17E;eme <em>zkop&#xED;rovat</em> celou sekvenci (<strong>jej&#xED; hodnoty</strong>), nap&#x159;&#xED;klad do jin&#xE9; prom&#x11B;nn&#xE9;:</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; numbers[:]\n[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]</code></pre></div><div class=\"admonition note\"><p>Pros&#xED;m vyzkou&#x161;ejte si, jak&#xFD; je rozd&#xED;l mez&#xED; n&#xE1;sleduj&#xED;c&#xED;mi p&#x159;&#xED;klady:</p>\n<div class=\"highlight\"><pre><code>numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\ncopy_numbers_variable = numbers\nslicing_numbers = numbers[:]</code></pre></div><p>P&#x159;&#xED;jdete na to?</p>\n</div><p>Dal&#x161;&#xED; mo&#x17E;n&#xE1; uk&#xE1;zka slicingu je m&#xE1;sleduj&#xED;c&#xED;:</p>\n<div class=\"highlight\"><pre><code>url = input(&apos;Please enter the URL:&apos;)\ndomain = url[11:-4]\n\nprint(&quot;Domain name: &quot; + domain)</code></pre></div><div class=\"highlight\"><pre><code>Please enter the URL: http://www.python.org\nDomain name: python</code></pre></div><h4>&#x158;ez po kroc&#xED;ch</h4>\n<p>Jako voliteln&#xFD; parametr m&#x16F;&#x17E;ete pou&#x17E;&#xED;t d&#xE9;lku kroku, kter&#xFD;m chcete &#x159;ez vytvo&#x159;it:</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; numbers[0:10:1]\n[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]</code></pre></div><div class=\"highlight\"><pre><code>&gt;&gt;&gt; numbers[0:10:2]\n[1, 3, 5, 7, 9]</code></pre></div><h4>Slu&#x10D;ov&#xE1;n&#xED; sekvenc&#xED;</h4>\n<p>Sekvence mohou b&#xFD;t slu&#x10D;ov&#xE1;ny pomoc&#xED; znaku plus.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; [1, 2, 3] + [4, 5,  6]\n[1, 2, 3, 4, 5, 6]\n&gt;&gt;&gt; &apos;Hello,&apos; + &apos;world!&apos;\n&apos;Hello, world!&apos;</code></pre></div><h4>Multiplika&#x10D;n&#xED; oper&#xE1;tor</h4>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; z = [3, 1] * 2\n&gt;&gt;&gt; z\n[3, 1, 3, 1]</code></pre></div><p>Pokud byste cht&#x11B;li vytvo&#x159;it pr&#xE1;zdn&#xFD; seznam s m&#xED;stem pro t&#x159;i prvky, m&#x16F;&#x17E;ete to ud&#x11B;lat takto:</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; s = [None] * 3\n&gt;&gt;&gt; s\n[None, None, None]</code></pre></div><h4>Zji&#x161;t&#x11B;n&#xED; prvku v sekvenci (Membership)</h4>\n<p>Abychom zjistili, zda je n&#x11B;jak&#xFD; prvek prkem sekvence, pou&#x17E;ijeme oper&#xE1;tor <em>in</em>. Tento oper&#xE1;tor ov&#x11B;&#x159;uje, zda je n&#x11B;co pravdiv&#xE9; nebo ne a podle toho vrac&#xED; n&#xE1;vratovou hodnotu <em>True/False</em>.</p>\n<div class=\"admonition note\"><p>True a False jsou tzv. logick&#xE9; oper&#xE1;tory</p>\n</div><div class=\"highlight\"><pre><code>&gt;&gt;&gt; 3 in [1, 2, 3, 4, 5]\nTrue\n&gt;&gt;&gt; 3 not in [1, 2, 3, 4, 5]\nFalse</code></pre></div><div class=\"highlight\"><pre><code>&gt;&gt;&gt; &apos;P&apos; in &apos;Python&apos;\nTrue</code></pre></div><h4>D&#xE9;lka sekvence, nalezen&#xED; minima a maxima</h4>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; numbers = [100, 34, 678]\n&gt;&gt;&gt; len(numbers)\n3\n&gt;&gt;&gt; max(numbers)\n678\n&gt;&gt;&gt; min(numbers)\n34\n&gt;&gt;&gt; max(2, 3)\n3\n&gt;&gt;&gt; min(9, 3, 2, 5)\n2</code></pre></div>\n\n\n        "
    }
  }
}