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.
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]]
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.
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'
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
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]
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!'
>>> 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]
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
>>> 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ákladních <em>datových struktur</em> 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.</p>\n<p>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>\n<h3>Přehled sekvencí</h3>\n<p>Python má několik základních typů sekvencí. Mezi nejpoužívanější patří seznamy a n-tice.</p>\n<p>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.</p>\n<p>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:</p>\n<div class=\"highlight\"><pre><code>>>> john_doe = ['John Doe', 40]\n>>> peter_smith = ['Peter Smith', 50]\n>>> database = [john_doe, peter_smith]\n>>> database\n[['John Doe', 40], ['Peter Smith', 50]]</code></pre></div><h3>Operace nad sekvencemi</h3>\n<p>Některé operace můžete provádět nad všemi sekvencemi. Mezi tyto operace patří <em>indexing</em>, <em>slicing</em>, <em>adding</em>, <em>multiplying</em> 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.</p>\n<h4>Indexování (Indexing)</h4>\n<p>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:</p>\n<div class=\"highlight\"><pre><code>>>> greeting = 'Hello'\n>>> greeting[0]\n'H'</code></pre></div><p>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čí <em>-1</em>. Přistoupit k poslední pozici v sekvenci proto můžeme takto:</p>\n<div class=\"highlight\"><pre><code>>>> greeting[-1]\n'o'</code></pre></div><div class=\"admonition note\"><p>Vyzkoušejte přistoupit k prvku přímo, bez použití proměnné</p>\n<div class=\"highlight\"><pre><code>>>> 'Hello'[1]\n'e'</code></pre></div></div><p>Také, pokud funkce vrací sekvenci, můžete přistoupit k hodnotě přímo:</p>\n<div class=\"highlight\"><pre><code>>>> fourth = input('Year: ')[3]\nYear: 2005\n>>> fourth\n'5'</code></pre></div><h4>Řez (Slicing)</h4>\n<p>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.</p>\n<div class=\"highlight\"><pre><code>>>> tag = '<a href="http://www.python.org">Python web site</a>'\n>>> tag[9:30]\n'http://www.python.org'\n>>> tag[32:-4]\n'Python web site'</code></pre></div><p>První index je číslo indexu prvního prvku, který chcete zahrnout. Ale druhý index je číslo prvku v sekvenci <em>za</em> vaším řezem.</p>\n<div class=\"highlight\"><pre><code>>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n>>> numbers[3:6]\n[4, 5, 6]\n>>> numbers[0:1]\n[1]</code></pre></div><p>Další příklady:</p>\n<div class=\"highlight\"><pre><code>>>> numbers[7:10]\n[8, 9, 10]</code></pre></div><p>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:</p>\n<div class=\"highlight\"><pre><code>>>> numbers[-3:-1]\n[8, 9]</code></pre></div><p>Pokud zkusíme toto, nebude to fungovat, tak jak očekáváme:</p>\n<div class=\"highlight\"><pre><code>>>> numbers[-3:0]\n[]</code></pre></div><p>Proto místo toho musíme použít tento zápis:</p>\n<div class=\"highlight\"><pre><code>>>> numbers[-3:]\n[8, 9, 10]</code></pre></div><p>Totéž můžeme udělat v opačném směru:</p>\n<div class=\"highlight\"><pre><code>>>> numbers[:3]\n[1, 2, 3]</code></pre></div><p>A pomocí následující syntaxe můžeme <em>zkopírovat</em> celou sekvenci (<strong>její hodnoty</strong>), například do jiné proměnné:</p>\n<div class=\"highlight\"><pre><code>>>> numbers[:]\n[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]</code></pre></div><div class=\"admonition note\"><p>Prosím vyzkoušejte si, jaký je rozdíl mezí následujícími pří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říjdete na to?</p>\n</div><p>Další možná ukázka slicingu je másledující:</p>\n<div class=\"highlight\"><pre><code>url = input('Please enter the URL:')\ndomain = url[11:-4]\n\nprint("Domain name: " + domain)</code></pre></div><div class=\"highlight\"><pre><code>Please enter the URL: http://www.python.org\nDomain name: python</code></pre></div><h4>Řez po krocích</h4>\n<p>Jako volitelný parametr můžete použít délku kroku, kterým chcete řez vytvořit:</p>\n<div class=\"highlight\"><pre><code>>>> numbers[0:10:1]\n[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]</code></pre></div><div class=\"highlight\"><pre><code>>>> numbers[0:10:2]\n[1, 3, 5, 7, 9]</code></pre></div><h4>Slučování sekvencí</h4>\n<p>Sekvence mohou být slučovány pomocí znaku plus.</p>\n<div class=\"highlight\"><pre><code>>>> [1, 2, 3] + [4, 5, 6]\n[1, 2, 3, 4, 5, 6]\n>>> 'Hello,' + 'world!'\n'Hello, world!'</code></pre></div><h4>Multiplikační operátor</h4>\n<div class=\"highlight\"><pre><code>>>> z = [3, 1] * 2\n>>> z\n[3, 1, 3, 1]</code></pre></div><p>Pokud byste chtěli vytvořit prázdný seznam s místem pro tři prvky, můžete to udělat takto:</p>\n<div class=\"highlight\"><pre><code>>>> s = [None] * 3\n>>> s\n[None, None, None]</code></pre></div><h4>Zjištění prvku v sekvenci (Membership)</h4>\n<p>Abychom zjistili, zda je nějaký prvek prkem sekvence, použijeme operátor <em>in</em>. Tento operátor ověřuje, zda je něco pravdivé nebo ne a podle toho vrací návratovou hodnotu <em>True/False</em>.</p>\n<div class=\"admonition note\"><p>True a False jsou tzv. logické operátory</p>\n</div><div class=\"highlight\"><pre><code>>>> 3 in [1, 2, 3, 4, 5]\nTrue\n>>> 3 not in [1, 2, 3, 4, 5]\nFalse</code></pre></div><div class=\"highlight\"><pre><code>>>> 'P' in 'Python'\nTrue</code></pre></div><h4>Délka sekvence, nalezení minima a maxima</h4>\n<div class=\"highlight\"><pre><code>>>> numbers = [100, 34, 678]\n>>> len(numbers)\n3\n>>> max(numbers)\n678\n>>> min(numbers)\n34\n>>> max(2, 3)\n3\n>>> min(9, 3, 2, 5)\n2</code></pre></div>\n\n\n " } } }