Seznamy (Lists)

Seznamy jsou proměnlivé (mutable) a to narozdíl od neměnných n-tic (imutable). Seznamy mají mnoho specializovaných metod pro práci a modifikací se seznamy. Nejprve však syntaxe vytváření seznamů.

Vytvoření seznamu

Prázdný seznam se vytvoří takto:

>>> x = []

Seznam s dvěmi prvky se vytvoří takto:

>>> list = [1, 2]

Funkce list()

Pokud budeme chtít převést prvky řetězce na seznam, můžeme to udělat takto:

>>> list('Hello')
['H', 'e', 'l', 'l', 'o']

Pokud bychom chtěli naopak sloučit seznam zpět do řetězce, můžeme použít funkci join().

>>> l = ['H', 'e', 'l', 'l', 'o']
>>> ''.join(l)
'Hello'

Základní operace nad seznamy

Změnna prvů

>>> x = [1, 1, 1]
>>> x[1] = 2
>>> x
[1, 2, 1]

Nemůžete změnit prvek, který neexistuje, proto následující příklad selže

>>> x = [1, 1, 1]
>> x[3] = 4
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range

Odstranění prvků

>>> names = ['Adam', 'Beta', 'Cyril', 'Dona', 'Eda']
>>> del names[2]
>>> names
['Adam', 'Beta', 'Dona', 'Eda']

Přiřazení k řezu

>>> name = list('Perl')
>>> name
['P', 'e', 'r', 'l']
>>> name[2:] = list('ar')
>>> name
['P', 'e', 'a', 'r']

Pokud používáme přiřazení k řezu, můžeme řezem prodloužit délku seznamu.

>>> name = list('Perl')
>>> name[1:] = list('ython')
>>> name
['P', 'y', 't', 'h', 'o', 'n']

Můžeme je dokonce použít, pokud chceme vložit prvky, anuž bychom chtěli nějaké změnit.

>>> numbers = [1, 5]
>>> numbers[1:1] = [2, 3, 4]
>>> numbers
[1, 2, 3, 4, 5]

Pokud chceme některé prvky odstranit, můžeme to udělat takto:

>>> numbers
[1, 2, 3, 4, 5]
>>> numbers[1:4] = []
>>> numbers
[1, 5]

Metody seznamů

Metoda je funkce, která je vázána k určitému objektu (číslo, seznam, n-tice...) a vykonává na něm nějakou akci. Volá se následovně:

object.method(arguments)

append

Metoda append přidává objekt na konec seznamu

>>> lst = [1, 2, 3]
>>> lst.append(4)
>>> lst
[1, 2, 3, 4]

Proč jsem nepoužil místo názvu proměnné lst list? Co by se stalo pak? Kdo na to příjde?

clear

Metoda clear vymaže obsah seznamu.

>>> lst = [1, 2, 3]
>>> lst.clear()
>>> lst
[]

copy

Metoda copy zkopíruje list.

Pozor na rozdíl mezi zkopírováním a přiřazením jiného jména k existujícímu seznamu!

>>> a = [1, 2, 3]
>>> b = a
>>> b[1] = 4
>>> a
[1, 4, 3]

Pokud chcete, aby listy a a b byly oddělené seznamy, musíte je zkopírovat.

>>> a = [1, 2, 3]
>>> b = a.copy()
>>> b[1] = 4
>>> a
[1, 2, 3]

count

Metoda count počítá, kolikrát se prvek vyskytl v poli.

>>> ['to', 'be', 'or', 'not', 'to',  'be'].count('to')
2
>>> x = [[1, 2], 1,  1,  [2, 1,  [1, 2]]]
>>> x.count(1)
2
>>> x.count([1, 2])
1

extend

Tato metoda umožňuje přidat několik hodnot najednou. Seznam tedy může být rozšířen o další seznam.

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]

Pozor na rozdíl mezi spojením dvou seznamů a rozšířením. Rozdíle je vidět na násladujícím příkladu.

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a + b
[1, 2, 3, 4, 5, 6]
>>> a
[1, 2, 3]

index

Metoda index se používá k nalezení prvního výskytu hodnoty.

>>> n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> n.index(6)
5
>>> n.index(11)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 11 is not in list

insert

Tato metoda vkládá objekt do existujícího seznamu.

>>> numbers = [1, 2, 3, 5, 6, 7]
>>> numbers.insert(3, 'four')
>>> numbers
[1, 2, 3, 'four', 5, 6, 7]

pop

Metoda pop odstraňuje (standardně) poslední prvek seznamu a vrátí jej jako návratovou hodnotu.

>>> x = [1, 2, 3]
>>> x.pop()
3
>>> x
[1, 2]
>>> x.pop(0)
1
>>> x
[2]

remove

Odstraňuje první výskyt hodnoty, kterou nalezne v seznamu.

>>> x = ['to', 'be', 'or', 'not', 'to', 'be']
>>> x.remove('be')
>>> x
['to', 'or', 'not', 'to', 'be']
>>> x.remove('bee')
Traceback (innermost last):
 File "<pyshell>", line 1, in ?
  x.remove('bee')
ValueError: list.remove(x): x not in list

reverse

Obrací pořadí prvků v seznamu.

>>> x = [1, 2, 3]
>>> x.reverse()
>>> x
[3, 2, 1]

sort

Tato metoda uspořádává in-place prvky v seznamu. To znamená, že nevrací jako návratovou hodnotu uspořádaný seznam, ale přímo jej modifikuje.

>>> x = [4, 6, 2, 1, 7, 9]
>>> x.sort()
>>> x
[1, 2, 4, 6, 7, 9]
>>> x = [4, 6, 2, 1, 7, 9]
>>> y = x.sort() # Takhle to nefunguje
>>> print(y)
None

Místo toho můžeme použít funkci sorted().

>>> x = [4, 6, 2, 1, 7, 9]
>>> y = sorted(x)
>>> x
[4, 6, 2, 1, 7, 9]
>>> y
[1, 2, 4, 6, 7, 9]
{
  "data": {
    "sessionMaterial": {
      "id": "session-material:2019/tieto-ostrava-jaro:lists-and-tupples:1",
      "title": "Seznamy (Lists)",
      "html": "\n          \n    \n\n    <h2>Seznamy (Lists)</h2>\n<p>Seznamy jsou prom&#x11B;nliv&#xE9; (mutable) a to narozd&#xED;l od nem&#x11B;nn&#xFD;ch n-tic (imutable). Seznamy maj&#xED; mnoho specializovan&#xFD;ch metod pro pr&#xE1;ci a modifikac&#xED; se seznamy. Nejprve v&#x161;ak syntaxe vytv&#xE1;&#x159;en&#xED; seznam&#x16F;.</p>\n<h3>Vytvo&#x159;en&#xED; seznamu</h3>\n<p>Pr&#xE1;zdn&#xFD; seznam se vytvo&#x159;&#xED; takto:</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; x = []</code></pre></div><p>Seznam s dv&#x11B;mi prvky se vytvo&#x159;&#xED; takto:</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; list = [1, 2]</code></pre></div><h3>Funkce list()</h3>\n<p>Pokud budeme cht&#xED;t p&#x159;ev&#xE9;st prvky &#x159;et&#x11B;zce na seznam, m&#x16F;&#x17E;eme to ud&#x11B;lat takto:</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; list(&apos;Hello&apos;)\n[&apos;H&apos;, &apos;e&apos;, &apos;l&apos;, &apos;l&apos;, &apos;o&apos;]</code></pre></div><p>Pokud bychom cht&#x11B;li naopak slou&#x10D;it seznam zp&#x11B;t do &#x159;et&#x11B;zce, m&#x16F;&#x17E;eme pou&#x17E;&#xED;t funkci <em>join()</em>.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; l = [&apos;H&apos;, &apos;e&apos;, &apos;l&apos;, &apos;l&apos;, &apos;o&apos;]\n&gt;&gt;&gt; &apos;&apos;.join(l)\n&apos;Hello&apos;</code></pre></div><h3>Z&#xE1;kladn&#xED; operace nad seznamy</h3>\n<h4>Zm&#x11B;nna prv&#x16F;</h4>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; x = [1, 1, 1]\n&gt;&gt;&gt; x[1] = 2\n&gt;&gt;&gt; x\n[1, 2, 1]</code></pre></div><div class=\"admonition note\"><p>Nem&#x16F;&#x17E;ete zm&#x11B;nit prvek, kter&#xFD; neexistuje, proto n&#xE1;sleduj&#xED;c&#xED; p&#x159;&#xED;klad sel&#x17E;e</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; x = [1, 1, 1]\n&gt;&gt; x[3] = 4\nTraceback (most recent call last):\n File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;\nIndexError: list assignment index out of range</code></pre></div></div><h4>Odstran&#x11B;n&#xED; prvk&#x16F;</h4>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; names = [&apos;Adam&apos;, &apos;Beta&apos;, &apos;Cyril&apos;, &apos;Dona&apos;, &apos;Eda&apos;]\n&gt;&gt;&gt; del names[2]\n&gt;&gt;&gt; names\n[&apos;Adam&apos;, &apos;Beta&apos;, &apos;Dona&apos;, &apos;Eda&apos;]</code></pre></div><h4>P&#x159;i&#x159;azen&#xED; k &#x159;ezu</h4>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; name = list(&apos;Perl&apos;)\n&gt;&gt;&gt; name\n[&apos;P&apos;, &apos;e&apos;, &apos;r&apos;, &apos;l&apos;]\n&gt;&gt;&gt; name[2:] = list(&apos;ar&apos;)\n&gt;&gt;&gt; name\n[&apos;P&apos;, &apos;e&apos;, &apos;a&apos;, &apos;r&apos;]</code></pre></div><p>Pokud pou&#x17E;&#xED;v&#xE1;me p&#x159;i&#x159;azen&#xED; k &#x159;ezu, m&#x16F;&#x17E;eme &#x159;ezem prodlou&#x17E;it d&#xE9;lku seznamu.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; name = list(&apos;Perl&apos;)\n&gt;&gt;&gt; name[1:] = list(&apos;ython&apos;)\n&gt;&gt;&gt; name\n[&apos;P&apos;, &apos;y&apos;, &apos;t&apos;, &apos;h&apos;, &apos;o&apos;, &apos;n&apos;]</code></pre></div><p>M&#x16F;&#x17E;eme je dokonce pou&#x17E;&#xED;t, pokud chceme <em>vlo&#x17E;it</em> prvky, anu&#x17E; bychom cht&#x11B;li n&#x11B;jak&#xE9; zm&#x11B;nit.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; numbers = [1, 5]\n&gt;&gt;&gt; numbers[1:1] = [2, 3, 4]\n&gt;&gt;&gt; numbers\n[1, 2, 3, 4, 5]</code></pre></div><p>Pokud chceme n&#x11B;kter&#xE9; prvky odstranit, m&#x16F;&#x17E;eme to ud&#x11B;lat takto:</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; numbers\n[1, 2, 3, 4, 5]\n&gt;&gt;&gt; numbers[1:4] = []\n&gt;&gt;&gt; numbers\n[1, 5]</code></pre></div><h3>Metody seznam&#x16F;</h3>\n<p>Metoda je funkce, kter&#xE1; je v&#xE1;z&#xE1;na k ur&#x10D;it&#xE9;mu objektu (&#x10D;&#xED;slo, seznam, n-tice...) a vykon&#xE1;v&#xE1; na n&#x11B;m n&#x11B;jakou akci. Vol&#xE1; se n&#xE1;sledovn&#x11B;:</p>\n<div class=\"highlight\"><pre><code>object.method(arguments)</code></pre></div><p><strong>append</strong></p>\n<p>Metoda <em>append</em> p&#x159;id&#xE1;v&#xE1; objekt na konec seznamu</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; lst = [1, 2, 3]\n&gt;&gt;&gt; lst.append(4)\n&gt;&gt;&gt; lst\n[1, 2, 3, 4]</code></pre></div><div class=\"admonition note\"><p>Pro&#x10D; jsem nepou&#x17E;il m&#xED;sto n&#xE1;zvu prom&#x11B;nn&#xE9; lst list? Co by se stalo pak? Kdo na to p&#x159;&#xED;jde?</p>\n</div><p><strong>clear</strong></p>\n<p>Metoda clear vyma&#x17E;e obsah seznamu.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; lst = [1, 2, 3]\n&gt;&gt;&gt; lst.clear()\n&gt;&gt;&gt; lst\n[]</code></pre></div><p><strong>copy</strong></p>\n<p>Metoda copy zkop&#xED;ruje list.</p>\n<div class=\"admonition warning\"><p>Pozor na rozd&#xED;l mezi zkop&#xED;rov&#xE1;n&#xED;m a p&#x159;i&#x159;azen&#xED;m jin&#xE9;ho jm&#xE9;na k existuj&#xED;c&#xED;mu seznamu!</p>\n</div><div class=\"highlight\"><pre><code>&gt;&gt;&gt; a = [1, 2, 3]\n&gt;&gt;&gt; b = a\n&gt;&gt;&gt; b[1] = 4\n&gt;&gt;&gt; a\n[1, 4, 3]</code></pre></div><p>Pokud chcete, aby listy <em>a</em> a <em>b</em> byly odd&#x11B;len&#xE9; seznamy, mus&#xED;te je zkop&#xED;rovat.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; a = [1, 2, 3]\n&gt;&gt;&gt; b = a.copy()\n&gt;&gt;&gt; b[1] = 4\n&gt;&gt;&gt; a\n[1, 2, 3]</code></pre></div><p><strong>count</strong></p>\n<p>Metoda count po&#x10D;&#xED;t&#xE1;, kolikr&#xE1;t se prvek vyskytl v poli.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; [&apos;to&apos;, &apos;be&apos;, &apos;or&apos;, &apos;not&apos;, &apos;to&apos;,  &apos;be&apos;].count(&apos;to&apos;)\n2\n&gt;&gt;&gt; x = [[1, 2], 1,  1,  [2, 1,  [1, 2]]]\n&gt;&gt;&gt; x.count(1)\n2\n&gt;&gt;&gt; x.count([1, 2])\n1</code></pre></div><p><strong>extend</strong></p>\n<p>Tato metoda umo&#x17E;&#x148;uje p&#x159;idat n&#x11B;kolik hodnot najednou. Seznam tedy m&#x16F;&#x17E;e b&#xFD;t roz&#x161;&#xED;&#x159;en o dal&#x161;&#xED; seznam.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; a = [1, 2, 3]\n&gt;&gt;&gt; b = [4, 5, 6]\n&gt;&gt;&gt; a.extend(b)\n&gt;&gt;&gt; a\n[1, 2, 3, 4, 5, 6]</code></pre></div><p>Pozor na rozd&#xED;l mezi <em>spojen&#xED;m</em> dvou seznam&#x16F; a roz&#x161;&#xED;&#x159;en&#xED;m. Rozd&#xED;le je vid&#x11B;t na n&#xE1;sladuj&#xED;c&#xED;m p&#x159;&#xED;kladu.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; a = [1, 2, 3]\n&gt;&gt;&gt; b = [4, 5, 6]\n&gt;&gt;&gt; a + b\n[1, 2, 3, 4, 5, 6]\n&gt;&gt;&gt; a\n[1, 2, 3]</code></pre></div><p><strong>index</strong></p>\n<p>Metoda <em>index</em> se pou&#x17E;&#xED;v&#xE1; k nalezen&#xED; prvn&#xED;ho v&#xFD;skytu hodnoty.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n&gt;&gt;&gt; n.index(6)\n5\n&gt;&gt;&gt; n.index(11)\nTraceback (most recent call last):\n  File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;\nValueError: 11 is not in list</code></pre></div><p><strong>insert</strong></p>\n<p>Tato metoda vkl&#xE1;d&#xE1; objekt do existuj&#xED;c&#xED;ho seznamu.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; numbers = [1, 2, 3, 5, 6, 7]\n&gt;&gt;&gt; numbers.insert(3, &apos;four&apos;)\n&gt;&gt;&gt; numbers\n[1, 2, 3, &apos;four&apos;, 5, 6, 7]</code></pre></div><p><strong>pop</strong></p>\n<p>Metoda pop odstra&#x148;uje (standardn&#x11B;) posledn&#xED; prvek seznamu a vr&#xE1;t&#xED; jej jako n&#xE1;vratovou hodnotu.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; x = [1, 2, 3]\n&gt;&gt;&gt; x.pop()\n3\n&gt;&gt;&gt; x\n[1, 2]\n&gt;&gt;&gt; x.pop(0)\n1\n&gt;&gt;&gt; x\n[2]</code></pre></div><p><strong>remove</strong></p>\n<p>Odstra&#x148;uje prvn&#xED; v&#xFD;skyt hodnoty, kterou nalezne v seznamu.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; x = [&apos;to&apos;, &apos;be&apos;, &apos;or&apos;, &apos;not&apos;, &apos;to&apos;, &apos;be&apos;]\n&gt;&gt;&gt; x.remove(&apos;be&apos;)\n&gt;&gt;&gt; x\n[&apos;to&apos;, &apos;or&apos;, &apos;not&apos;, &apos;to&apos;, &apos;be&apos;]\n&gt;&gt;&gt; x.remove(&apos;bee&apos;)\nTraceback (innermost last):\n File &quot;&lt;pyshell&gt;&quot;, line 1, in ?\n  x.remove(&apos;bee&apos;)\nValueError: list.remove(x): x not in list</code></pre></div><p><strong>reverse</strong></p>\n<p>Obrac&#xED; po&#x159;ad&#xED; prvk&#x16F; v seznamu.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; x = [1, 2, 3]\n&gt;&gt;&gt; x.reverse()\n&gt;&gt;&gt; x\n[3, 2, 1]</code></pre></div><p><strong>sort</strong></p>\n<p>Tato metoda uspo&#x159;&#xE1;d&#xE1;v&#xE1; <em>in-place</em> prvky v seznamu. To znamen&#xE1;, &#x17E;e nevrac&#xED; jako n&#xE1;vratovou hodnotu uspo&#x159;&#xE1;dan&#xFD; seznam, ale p&#x159;&#xED;mo jej modifikuje.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; x = [4, 6, 2, 1, 7, 9]\n&gt;&gt;&gt; x.sort()\n&gt;&gt;&gt; x\n[1, 2, 4, 6, 7, 9]</code></pre></div><div class=\"highlight\"><pre><code>&gt;&gt;&gt; x = [4, 6, 2, 1, 7, 9]\n&gt;&gt;&gt; y = x.sort() # Takhle to nefunguje\n&gt;&gt;&gt; print(y)\nNone</code></pre></div><p>M&#xED;sto toho m&#x16F;&#x17E;eme pou&#x17E;&#xED;t funkci <em>sorted()</em>.</p>\n<div class=\"highlight\"><pre><code>&gt;&gt;&gt; x = [4, 6, 2, 1, 7, 9]\n&gt;&gt;&gt; y = sorted(x)\n&gt;&gt;&gt; x\n[4, 6, 2, 1, 7, 9]\n&gt;&gt;&gt; y\n[1, 2, 4, 6, 7, 9]</code></pre></div>\n\n\n        "
    }
  }
}