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ů.
Prázdný seznam se vytvoří takto:
>>> x = []
Seznam s dvěmi prvky se vytvoří takto:
>>> list = [1, 2]
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'
>>> 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
>>> names = ['Adam', 'Beta', 'Cyril', 'Dona', 'Eda']
>>> del names[2]
>>> names
['Adam', 'Beta', 'Dona', 'Eda']
>>> 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]
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ě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ů.</p>\n<h3>Vytvoření seznamu</h3>\n<p>Prázdný seznam se vytvoří takto:</p>\n<div class=\"highlight\"><pre><code>>>> x = []</code></pre></div><p>Seznam s dvěmi prvky se vytvoří takto:</p>\n<div class=\"highlight\"><pre><code>>>> list = [1, 2]</code></pre></div><h3>Funkce list()</h3>\n<p>Pokud budeme chtít převést prvky řetězce na seznam, můžeme to udělat takto:</p>\n<div class=\"highlight\"><pre><code>>>> list('Hello')\n['H', 'e', 'l', 'l', 'o']</code></pre></div><p>Pokud bychom chtěli naopak sloučit seznam zpět do řetězce, můžeme použít funkci <em>join()</em>.</p>\n<div class=\"highlight\"><pre><code>>>> l = ['H', 'e', 'l', 'l', 'o']\n>>> ''.join(l)\n'Hello'</code></pre></div><h3>Základní operace nad seznamy</h3>\n<h4>Změnna prvů</h4>\n<div class=\"highlight\"><pre><code>>>> x = [1, 1, 1]\n>>> x[1] = 2\n>>> x\n[1, 2, 1]</code></pre></div><div class=\"admonition note\"><p>Nemůžete změnit prvek, který neexistuje, proto následující příklad selže</p>\n<div class=\"highlight\"><pre><code>>>> x = [1, 1, 1]\n>> x[3] = 4\nTraceback (most recent call last):\n File "<stdin>", line 1, in <module>\nIndexError: list assignment index out of range</code></pre></div></div><h4>Odstranění prvků</h4>\n<div class=\"highlight\"><pre><code>>>> names = ['Adam', 'Beta', 'Cyril', 'Dona', 'Eda']\n>>> del names[2]\n>>> names\n['Adam', 'Beta', 'Dona', 'Eda']</code></pre></div><h4>Přiřazení k řezu</h4>\n<div class=\"highlight\"><pre><code>>>> name = list('Perl')\n>>> name\n['P', 'e', 'r', 'l']\n>>> name[2:] = list('ar')\n>>> name\n['P', 'e', 'a', 'r']</code></pre></div><p>Pokud používáme přiřazení k řezu, můžeme řezem prodloužit délku seznamu.</p>\n<div class=\"highlight\"><pre><code>>>> name = list('Perl')\n>>> name[1:] = list('ython')\n>>> name\n['P', 'y', 't', 'h', 'o', 'n']</code></pre></div><p>Můžeme je dokonce použít, pokud chceme <em>vložit</em> prvky, anuž bychom chtěli nějaké změnit.</p>\n<div class=\"highlight\"><pre><code>>>> numbers = [1, 5]\n>>> numbers[1:1] = [2, 3, 4]\n>>> numbers\n[1, 2, 3, 4, 5]</code></pre></div><p>Pokud chceme některé prvky odstranit, můžeme to udělat takto:</p>\n<div class=\"highlight\"><pre><code>>>> numbers\n[1, 2, 3, 4, 5]\n>>> numbers[1:4] = []\n>>> numbers\n[1, 5]</code></pre></div><h3>Metody seznamů</h3>\n<p>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ě:</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řidává objekt na konec seznamu</p>\n<div class=\"highlight\"><pre><code>>>> lst = [1, 2, 3]\n>>> lst.append(4)\n>>> lst\n[1, 2, 3, 4]</code></pre></div><div class=\"admonition note\"><p>Proč jsem nepoužil místo názvu proměnné lst list? Co by se stalo pak? Kdo na to příjde?</p>\n</div><p><strong>clear</strong></p>\n<p>Metoda clear vymaže obsah seznamu.</p>\n<div class=\"highlight\"><pre><code>>>> lst = [1, 2, 3]\n>>> lst.clear()\n>>> lst\n[]</code></pre></div><p><strong>copy</strong></p>\n<p>Metoda copy zkopíruje list.</p>\n<div class=\"admonition warning\"><p>Pozor na rozdíl mezi zkopírováním a přiřazením jiného jména k existujícímu seznamu!</p>\n</div><div class=\"highlight\"><pre><code>>>> a = [1, 2, 3]\n>>> b = a\n>>> b[1] = 4\n>>> a\n[1, 4, 3]</code></pre></div><p>Pokud chcete, aby listy <em>a</em> a <em>b</em> byly oddělené seznamy, musíte je zkopírovat.</p>\n<div class=\"highlight\"><pre><code>>>> a = [1, 2, 3]\n>>> b = a.copy()\n>>> b[1] = 4\n>>> a\n[1, 2, 3]</code></pre></div><p><strong>count</strong></p>\n<p>Metoda count počítá, kolikrát se prvek vyskytl v poli.</p>\n<div class=\"highlight\"><pre><code>>>> ['to', 'be', 'or', 'not', 'to', 'be'].count('to')\n2\n>>> x = [[1, 2], 1, 1, [2, 1, [1, 2]]]\n>>> x.count(1)\n2\n>>> x.count([1, 2])\n1</code></pre></div><p><strong>extend</strong></p>\n<p>Tato metoda umožňuje přidat několik hodnot najednou. Seznam tedy může být rozšířen o další seznam.</p>\n<div class=\"highlight\"><pre><code>>>> a = [1, 2, 3]\n>>> b = [4, 5, 6]\n>>> a.extend(b)\n>>> a\n[1, 2, 3, 4, 5, 6]</code></pre></div><p>Pozor na rozdíl mezi <em>spojením</em> dvou seznamů a rozšířením. Rozdíle je vidět na násladujícím příkladu.</p>\n<div class=\"highlight\"><pre><code>>>> a = [1, 2, 3]\n>>> b = [4, 5, 6]\n>>> a + b\n[1, 2, 3, 4, 5, 6]\n>>> a\n[1, 2, 3]</code></pre></div><p><strong>index</strong></p>\n<p>Metoda <em>index</em> se používá k nalezení prvního výskytu hodnoty.</p>\n<div class=\"highlight\"><pre><code>>>> n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n>>> n.index(6)\n5\n>>> n.index(11)\nTraceback (most recent call last):\n File "<stdin>", line 1, in <module>\nValueError: 11 is not in list</code></pre></div><p><strong>insert</strong></p>\n<p>Tato metoda vkládá objekt do existujícího seznamu.</p>\n<div class=\"highlight\"><pre><code>>>> numbers = [1, 2, 3, 5, 6, 7]\n>>> numbers.insert(3, 'four')\n>>> numbers\n[1, 2, 3, 'four', 5, 6, 7]</code></pre></div><p><strong>pop</strong></p>\n<p>Metoda pop odstraňuje (standardně) poslední prvek seznamu a vrátí jej jako návratovou hodnotu.</p>\n<div class=\"highlight\"><pre><code>>>> x = [1, 2, 3]\n>>> x.pop()\n3\n>>> x\n[1, 2]\n>>> x.pop(0)\n1\n>>> x\n[2]</code></pre></div><p><strong>remove</strong></p>\n<p>Odstraňuje první výskyt hodnoty, kterou nalezne v seznamu.</p>\n<div class=\"highlight\"><pre><code>>>> x = ['to', 'be', 'or', 'not', 'to', 'be']\n>>> x.remove('be')\n>>> x\n['to', 'or', 'not', 'to', 'be']\n>>> x.remove('bee')\nTraceback (innermost last):\n File "<pyshell>", line 1, in ?\n x.remove('bee')\nValueError: list.remove(x): x not in list</code></pre></div><p><strong>reverse</strong></p>\n<p>Obrací pořadí prvků v seznamu.</p>\n<div class=\"highlight\"><pre><code>>>> x = [1, 2, 3]\n>>> x.reverse()\n>>> x\n[3, 2, 1]</code></pre></div><p><strong>sort</strong></p>\n<p>Tato metoda uspořádává <em>in-place</em> prvky v seznamu. To znamená, že nevrací jako návratovou hodnotu uspořádaný seznam, ale přímo jej modifikuje.</p>\n<div class=\"highlight\"><pre><code>>>> x = [4, 6, 2, 1, 7, 9]\n>>> x.sort()\n>>> x\n[1, 2, 4, 6, 7, 9]</code></pre></div><div class=\"highlight\"><pre><code>>>> x = [4, 6, 2, 1, 7, 9]\n>>> y = x.sort() # Takhle to nefunguje\n>>> print(y)\nNone</code></pre></div><p>Místo toho můžeme použít funkci <em>sorted()</em>.</p>\n<div class=\"highlight\"><pre><code>>>> x = [4, 6, 2, 1, 7, 9]\n>>> y = sorted(x)\n>>> x\n[4, 6, 2, 1, 7, 9]\n>>> y\n[1, 2, 4, 6, 7, 9]</code></pre></div>\n\n\n " } } }