Encyklopedické informace z této stránky shrnuje Tahák na seznamy, který si můžeš vytisknout.
Dnes si ukážeme, jak pracovat se seznamy (angl. lists). Zapisují se hranatými závorkami:
zviratka = ['pes', 'kočka', 'králík']
print(zviratka)
Nemůžeš najít hranaté závorky? Na české klávesnici zkus pravý Alt + F a G.
Seznam je hodnota, která může obsahovat spoustu dalších hodnot.
Tak jako řetězec obsahuje sekvenci znaků,
seznam obsahuje sekvenci... čehokoliv. Třeba slov (řetězců).
A tak jako můžeme pomocí cyklu for
procházet řetězec po znacích,
seznam můžeme procházet po jednotlivých prvcích:
for zviratko in zviratka:
print(zviratko)
Seznamy se v programech vyskytují velice často:
soubor se dá načíst jako seznam řetězců
s jednotlivými řádky,
seznam řetězců jako '7♥'
a 'K♣'
může posloužit jako balíček karet,
matematika je plná číselných řad,
každá online služba má seznam uživatelů.
Hodnoty v seznamu můžou být jakéhokoli typu. Dokonce můžeme různé typy míchat v jednom seznamu (i když s takovými namixovanými seznamy se příliš často nesetkáme – více se různé typy hodnot používají v n-ticích, o kterých si povíme později):
seznam = [1, 'abc', True, None, range(10), len]
print(seznam)
Důležitá vlastnost seznamů je, že se dají měnit.
Než vysvětlíme o co jde, připomeňme si jak fungují hodnoty, které se měnit
nedají – např. čísla, řetězce, True
/False
/None
.
Vyzkoušej si následující kousek kódu. Co je na něm „špatně“?
kamaradka = 'Žaneta'
print(kamaradka)
kamaradka.upper()
print(kamaradka)
Proměnná kamaradka
obsahuje řetězec 'Žaneta'
(který se už nedá změnit).
Metoda upper()
vytvoří a vrátí nový řetězec.
Výsledná hodnota se ale v našem programu nevyužije – Python ji vypočítá,
ale pak na ni „zapomene“.
Oprava je snadná: výsledek uložit do proměnné. Často budeš chtít takový výsledek uložit do původní proměnné:
kamaradka = kamaradka.upper()
Tímto přiřazením Python „zapomene“ na původní hodnotu,
a od tohoto příkazu dál bude proměnná kamaradka
označovat nový řetězec.
Podobně by se dala proměnná přenastavit na jakoukoli jinou hodnotu:
kamaradka = 'Žaneta'
print(kamaradka)
kamaradka = 'Alexandra'
print(kamaradka)
A jak jsou na tom seznamy? Ty se měnit dají.
Základní způsob, jak změnit seznam, je přidání
prvku na konec pomocí metody append
.
Ta nic nevrací (resp. vrací None
), ale „na místě” (angl. in place) změní
seznam, na kterém pracuje. Vyzkoušej si to:
>>> zviratka = ['pes', 'kočka', 'králík']
>>> print(zviratka)
['pes', 'kočka', 'králík']
>>> zviratka.append('morče')
>>> print(zviratka)
['pes', 'kočka', 'králík', 'morče']
Všimni si, že proměnná zviratka
se nastavuje jen na začátku.
V celém programu výše jen jeden seznam – na začátku má tři prvky, pak
mu jeden přibude, ale stále je to jeden a ten samý seznam.
Takové měnění může být občas překvapující, protože stejná hodnota může být přiřazená ve více proměnných. Protože se mění hodnota samotná, může to vypadat, že se „mění proměnná, aniž na ni sáhneme”:
a = [1, 2, 3] # Vytvoření seznamu
b = a # Tady se nový seznam nevytváří!
# seznam vytvořený v prvním řádku má teď dvě jména: "a" a "b",
# ale stále pracujeme jenom s jedním seznamem
print(b)
a.append(4)
print(b)
Kromě metody append
, která přidává jediný prvek na konec, existuje
spousta metod, které mění seznamy.
Všechny udělají přímo v daném seznamu, a (kromě pop
) vrací None
:
extend()
přidá více prvků najednou,insert()
přidá prvek na danou pozici,pop()
odebere a vrátí poslední prvek,remove()
odstraní první výskyt daného prvku,sort()
seznam seřadí (řetězce “podle abecedy”, čísla vzestupně),reverse()
obrátí pořadí prvků,clear()
odstraní všechny prvky.Například:
zviratka = ['pes', 'kočka', 'králík']
zviratka.append('morče') # ['pes', 'kočka', 'králík', 'morče']
zviratka.insert(2, 'had') # ['pes', 'kočka', 'had', 'králík', 'morče']
zviratka.pop() # ['pes', 'kočka', 'had', 'králík'], vrátí 'morče'
zviratka.remove('had') # ['pes', 'kočka', 'králík']
zviratka.sort() # ['kočka', 'králík', 'pes']
zviratka.reverse() # ['pes', 'králík', 'kočka']
zviratka.clear() # []
Často budeš ze seznamu chtít vybrat prvek na určité pozici. To funguje jako u řetězců: do hranatých závorek dáš číslo prvku. Stejně jako u řetězců se čísluje od nuly a záporná čísla označují prvky od konce.
zviratka = ['pes', 'kočka', 'králík']
print(zviratka[2])
Hranatými závorkami můžeš získat i podseznam. Diagram z materiálů k řetězcům ukazuje, jak u takového „sekání” číslovat: funguje to stejně, jen místo menšího řetězce dostaneš menší seznam.
print(zviratka[2:-3])
„Sekáním“ vzniká nový seznam – když pak ten původní změníš, v podseznamu se to neprojeví.
Na rozdíl od řetězců (které se nedají měnit) můžeš u existujících seznamů nastavovat konkrétní prvky – a to tak, že do prvku přiřadíš jako by to byla proměnná:
zviratka = ['pes', 'kočka', 'králík']
zviratka[1] = 'koťátko'
print(zviratka)
Přiřazovat se dá i do podseznamu – v tomto případě se podseznam nahradí jednotlivými prvky z toho, co přiřadíš.
zviratka = ['pes', 'kočka', 'králík', 'had', 'andulka']
print([1:-1])
zviratka[1:-1] = ['koťátko', 'králíček', 'hádě']
print(zviratka)
Přiřazením do podseznamu se dá i změnit délka seznamu, nebo některé prvky úplně odstranit:
zviratka = ['pes', 'kočka', 'králík']
zviratka[1:-1] = ['had', 'ještěrka', 'drak']
print(zviratka)
cisla[1:-1] = []
print(zviratka)
Tenhle zápis pro mazání prvků je ale docela
nepřehledný, a proto na to máme zvláštní příkaz jménem del
.
Jak už jeho název (z angl. delete, smazat)
napovídá, smaže, co mu přijde pod ruku – jednotlivé
prvky seznamů, podseznamy, … a dokonce i proměnné!
zviratka = ['pes', 'kočka', 'králík', 'had', 'ještěrka', 'andulka']
print(zviratka[-1])
del zviratka[-1]
print(zviratka)
print(zviratka[1:-1])
del zviratka[1:-1]
print(zviratka)
del zviratka
print(zviratka)
Nebo můžeš použít mazací metody zmíněné výše:
pop
, která odstraní a vrátí poslední prvek v seznamu,remove
, která najde v seznamu první výskyt daného prvku a odstraní ho,clear
, která vyprázdní celý seznam.balicek = ['eso', 'sedma', 'svršek', 'sedma', 'král']
liznuta_karta = karty.pop()
print(liznuta_karta)
print(balicek)
balicek.remove('sedma')
print(balicek)
balicek.clear()
print(balicek)
A taky tu máme metodu sort
, která prvky seznamu seřadí.
seznam = [4, 7, 8, 3, 5, 2, 4, 8, 5]
seznam.sort()
print(seznam)
Aby se daly seřadit, musí být prvky seznamu vzájemně
porovnatelné – konktrétně na ně musí fungovat
operátor <
.
Seznam s mixem čísel a řetězců tedy seřadit nepůjde.
Operátor <
definuje i
jak přesně se řadí (např. čísla podle velikosti;
řetězce podle speciální „abecedy” která řadí
velká písmena za malá, česká až za anglická, atd.).
Metoda sort
zná pojmenovaný argument
reverse
. Pokud ho nastavíš na True, řadí se „naopak”.
seznam = [4, 7, 8, 3, 5, 2, 4, 8, 5]
seznam.sort(reverse=True)
print(seznam)
Spousta toho, co můžeme dělat s řetězci, má stejný účinek i u seznamů. Třeba sečítání a násobení číslem:
melodie = ['C', 'E', 'G'] * 2 + ['E', 'E', 'D', 'E', 'F', 'D'] * 2 + ['E', 'D', 'C']
print(melodie)
Stejně jako u řetězců, sečítat jde jen seznam se seznamem – ne třeba seznam s řetězcem.
Další staří známí jsou funkce len
,
metody count
a index
, a operátor in
.
print(len(melodie)) # Délka seznamu
print(melodie.count('D')) # Počet 'D' v seznamu
print(melodie.index('D')) # Číslo prvního 'D'
print('D' in melodie) # Je 'D' v seznamu?
Poslední tři se ale přece jen chovají kapku jinak:
u řetězců pracují s podřetězci,
u seznamů jen s jednotlivými prvky.
Takže ačkoliv naše melodie obsahuje prvky
'D'
a 'E'
vedle sebe, 'DE'
v seznamu není:
print('DE' in melodie)
print(melodie.count('DE'))
print(melodie.index('DE'))
Seznam se dá použít v příkazu if
(nebo while
) jako podmínka,
která platí, když v tom seznamu něco je.
Jinými slovy, seznam
je tu „zkratka“ pro len(seznam) > 0
.
if seznam:
print('V seznamu něco je!')
else:
print('Seznam je prázdný!')
Podobně se dají v podmínce použít i řetězce. A dokonce i čísla – ta jako podmínka platí, pokud jsou nenulová.
Tak jako funkce int
převádí na
celá čísla a str
na řetězce,
funkce list
(angl. seznam) převádí na seznam.
Jako argument jí předáme jakoukoli hodnotu,
kterou umí zpracovat příkaz for
.
Z řetězců udělá seznam znaků, z otevřeného souboru
udělá seznam řádků, z range
udělá
seznam čísel.
abeceda = list('abcdefghijklmnopqrstuvwxyz')
cisla = list(range(100))
print(abeceda)
print(cisla)
I ze seznamu udělá funkce list
seznam.
To může znít zbytečně, ale není – vytvoří se
totiž nový seznam.
Bude mít sice stejné prvky ve stejném pořadí,
ale nebude to ten samý seznam:
měnit se bude nezávisle na tom starém.
a = [1, 2, 3]
b = list(a)
print(b)
a.append(4)
print(b)
Další způsob, jak tvořit seznamy
(zvláště složitější), je nejdřív udělat prázdný
seznam a pak ho postupně naplnit pomocí funkce append
.
Třeba pokud z nějakého důvodu chceš seznam
mocnin dvou, projdi čísla, kterými chceme mocnit,
cyklem for
a pro každé z nich
do seznamu přidej příslušnou mocninu:
mocniny_dvou = []
for cislo in range(10):
mocniny_dvou.append(2 ** cislo)
print(mocniny_dvou)
Chceš-li seznam, který reprezentuje balíček karet,
zavolej append
pro všechny kombinace barev a hodnot.
balicek = []
for barva in '♠', '♥', '♦', '♣': # (Na Windows použij textová jména)
for hodnota in list(range(2, 11)) + ['J', 'Q', 'K', 'A']:
balicek.append(str(hodnota) + barva)
print(balicek)
Seznamy a řetězce jsou druhy „sekvencí”,
takže snad nepřekvapí, že se dá různě převádět
z jednoho typu na druhý.
Funkce list
vytvoří z řetězce seznam znaků.
Když chceme dostat seznam slov, použijeme
na řetězci metodu split
(angl. rozdělit):
slova = 'Tato věta je složitá, rozdělme ji na slova!'.split()
print(slova)
Metoda split
umí brát i argument.
Pokud ho předáme, místo mezer (a nových řádků)
se řetězec „rozseká” daným oddělovačem.
Takže když máš nějaká data oddělená čárkami,
použíj split
s čárkou:
zaznamy = '3A,8B,2E,9D'.split(',')
print(zaznamy)
Chceš-li spojit seznam řetězců zase dohromady
do jediného řetězce, použij metodu join
(angl. spojit).
Pozor, tahle metoda se volá na oddělovači,
tedy řetězci, kterým se jednotlivé kousky „slepí”
dohromady; a jako argument bere seznam jednotlivých
řetězců.
veta = ' '.join(slova)
print(veta)
Modul random
obsahuje dvě funkce, které se hodí k seznamům.
Jako random.randrange
, obě mají něco
společného s náhodou.
Funkce shuffle
seznam „zamíchá” – všechny prvky náhodně popřehází.
Jako metoda sort
i funkce shuffle
nic nevrací.
import random
balicek = []
for barva in '♠', '♥', '♦', '♣':
for hodnota in list(range(2, 11)) + ['J', 'Q', 'K', 'A']:
balicek.append(str(hodnota) + barva)
print(balicek)
random.shuffle(balicek)
print(balicek)
A funkce choice
ze seznamu vybere jeden náhodný prvek.
S použitím seznamu tak můžeš třeba jednoduše vybrat tah pro hru
kámen/nůžky/papír:
import random
mozne_tahy = ['kámen', 'nůžky', 'papír']
tah_pocitace = random.choice(mozne_tahy)
A perlička na konec! Na začátku tohoto textu je napsáno, že seznam může obsahovat jakýkoli typ hodnot. Může třeba obsahovat i další seznamy:
seznam_seznamu = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Takový seznam se chová docela normálně – jdou z něj třeba brát jednotlivé prvky (které jsou ovšem taky seznamy):
prvni_seznam = seznam_seznamu[0]
print(prvni_seznam)
A protože jsou prvky samy seznamy, můžeme mluvit o věcech jako „první prvek druhého seznamu”:
druhy_seznam = seznam_seznamu[1]
prvni_prvek_druheho_seznamu = druhy_seznam[0]
print(prvni_prvek_druheho_seznamu)
A protože výraz seznam_seznamu[1]
označuje seznam, můžeme brát prvky přímo z něj:
prvni_prvek_druheho_seznamu = (seznam_seznamu[1])[0]
Neboli:
prvni_prvek_druheho_seznamu = seznam_seznamu[1][0]
A má tahle věc nějaké použití, ptáš se?
Stejně jako vnořené cykly for
nám umožnily vypsat tabulku, vnořené seznamy
nám umožní si tabulku „zapamatovat”.
def vytvor_tabulku(velikost=11):
seznam_radku = []
for a in range(velikost):
radek = []
for b in range(velikost):
radek.append(a * b)
seznam_radku.append(radek)
return seznam_radku
nasobilka = vytvor_tabulku()
print(nasobilka[2][3]) # dva krát tři
print(nasobilka[5][2]) # pět krát dva
print(nasobilka[8][7]) # osm krát sedm
# Vypsání celé tabulky
for radek in nasobilka:
for cislo in radek:
print(cislo, end=' ')
print()
Co s takovou „zapamatovanou” tabulkou? Můžeš si do ní uložit třeba pozice figurek na šachovnici nebo křížků a koleček ve 2D piškvorkách.
{ "data": { "sessionMaterial": { "id": "session-material:2019/brno-jaro-2019-pondeli:list:0", "title": "Seznamy", "html": "\n \n \n\n <p>Encyklopedické informace z této stránky shrnuje\n<a href=\"https://github.com/pyvec/cheatsheets/blob/master/lists/lists-cs.pdf\">Tahák na seznamy</a>,\nkterý si můžeš vytisknout.</p>\n<h1>Seznamy</h1>\n<p>Dnes si ukážeme, jak pracovat se <em>seznamy</em> (angl. <em>lists</em>).\nZapisují se hranatými závorkami:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">zviratka</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">'pes'</span><span class=\"p\">,</span> <span class=\"s1\">'kočka'</span><span class=\"p\">,</span> <span class=\"s1\">'králík'</span><span class=\"p\">]</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zviratka</span><span class=\"p\">)</span>\n</pre></div><div class=\"admonition note\"><p>Nemůžeš najít hranaté závorky?\nNa české klávesnici zkus pravý <kbd>Alt</kbd> + <kbd>F</kbd> a <kbd>G</kbd>.</p>\n</div><p>Seznam je hodnota, která může obsahovat spoustu dalších hodnot.\nTak jako řetězec obsahuje sekvenci znaků,\nseznam obsahuje sekvenci... čehokoliv. Třeba slov (řetězců).\nA tak jako můžeme pomocí cyklu <code>for</code>\nprocházet řetězec po znacích,\nseznam můžeme procházet po jednotlivých prvcích:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">for</span> <span class=\"n\">zviratko</span> <span class=\"ow\">in</span> <span class=\"n\">zviratka</span><span class=\"p\">:</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zviratko</span><span class=\"p\">)</span>\n</pre></div><p>Seznamy se v programech vyskytují velice často:\nsoubor se dá načíst jako seznam řetězců\ns jednotlivými řádky,\nseznam řetězců jako <code>'7♥'</code>\na <code>'K♣'</code> může posloužit jako balíček karet,\nmatematika je plná číselných řad,\nkaždá online služba má seznam uživatelů.</p>\n<p>Hodnoty v seznamu můžou být jakéhokoli typu.\nDokonce můžeme různé typy míchat v jednom seznamu\n(i když s takovými namixovanými seznamy se\npříliš často nesetkáme – více se různé typy hodnot\npoužívají v <var>n</var>-ticích, o kterých si povíme později):</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">seznam</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s1\">'abc'</span><span class=\"p\">,</span> <span class=\"bp\">True</span><span class=\"p\">,</span> <span class=\"bp\">None</span><span class=\"p\">,</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">10</span><span class=\"p\">),</span> <span class=\"nb\">len</span><span class=\"p\">]</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">seznam</span><span class=\"p\">)</span>\n</pre></div><h2>Neměnitelné hodnoty</h2>\n<p>Důležitá vlastnost seznamů je, že se dají <em>měnit</em>.</p>\n<p>Než vysvětlíme o co jde, připomeňme si jak fungují hodnoty, které se měnit\nnedají – např. čísla, řetězce, <code>True</code>/<code>False</code>/<code>None</code>.</p>\n<p>Vyzkoušej si následující kousek kódu. Co je na něm „špatně“?</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">kamaradka</span> <span class=\"o\">=</span> <span class=\"s1\">'Žaneta'</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">kamaradka</span><span class=\"p\">)</span>\n<span class=\"n\">kamaradka</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">()</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">kamaradka</span><span class=\"p\">)</span>\n</pre></div><p>Proměnná <code>kamaradka</code> obsahuje řetězec <code>'Žaneta'</code> (který se už nedá změnit).\nMetoda <code>upper()</code> vytvoří a vrátí <em>nový</em> řetězec.\nVýsledná hodnota se ale v našem programu nevyužije – Python ji vypočítá,\nale pak na ni „zapomene“.</p>\n<p>Oprava je snadná: výsledek uložit do proměnné.\nČasto budeš chtít takový výsledek uložit do původní proměnné:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">kamaradka</span> <span class=\"o\">=</span> <span class=\"n\">kamaradka</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">()</span>\n</pre></div><p>Tímto přiřazením Python „zapomene“ na původní hodnotu,\na od tohoto příkazu dál bude proměnná <code>kamaradka</code> označovat nový řetězec.</p>\n<p>Podobně by se dala proměnná přenastavit na jakoukoli jinou hodnotu:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">kamaradka</span> <span class=\"o\">=</span> <span class=\"s1\">'Žaneta'</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">kamaradka</span><span class=\"p\">)</span>\n<span class=\"n\">kamaradka</span> <span class=\"o\">=</span> <span class=\"s1\">'Alexandra'</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">kamaradka</span><span class=\"p\">)</span>\n</pre></div><h2>Měnění seznamů</h2>\n<p>A jak jsou na tom seznamy?\nTy se měnit dají.</p>\n<p>Základní způsob, jak změnit seznam, je přidání\nprvku na konec pomocí metody <code>append</code>.\nTa <em>nic nevrací</em> (resp. vrací <code>None</code>), ale „na místě” (angl. <em>in place</em>) změní\nseznam, na kterém pracuje. Vyzkoušej si to:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">>>> </span><span class=\"n\">zviratka</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">'pes'</span><span class=\"p\">,</span> <span class=\"s1\">'kočka'</span><span class=\"p\">,</span> <span class=\"s1\">'králík'</span><span class=\"p\">]</span>\n<span class=\"gp\">>>> </span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zviratka</span><span class=\"p\">)</span>\n<span class=\"go\">['pes', 'kočka', 'králík']</span>\n<span class=\"gp\">>>> </span><span class=\"n\">zviratka</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"s1\">'morče'</span><span class=\"p\">)</span>\n<span class=\"gp\">>>> </span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zviratka</span><span class=\"p\">)</span>\n<span class=\"go\">['pes', 'kočka', 'králík', 'morče']</span>\n</pre></div><p>Všimni si, že proměnná <code>zviratka</code> se nastavuje jen na začátku.\nV celém programu výše jen jeden seznam – na začátku má tři prvky, pak\nmu jeden přibude, ale stále je to jeden a ten samý seznam.</p>\n<p>Takové měnění může být občas překvapující,\nprotože stejná hodnota může být přiřazená ve více proměnných.\nProtože se mění hodnota samotná, může to vypadat,\nže se „mění proměnná, aniž na ni sáhneme”:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">]</span> <span class=\"c1\"># Vytvoření seznamu</span>\n<span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">a</span> <span class=\"c1\"># Tady se nový seznam nevytváří!</span>\n\n<span class=\"c1\"># seznam vytvořený v prvním řádku má teď dvě jména: "a" a "b",</span>\n<span class=\"c1\"># ale stále pracujeme jenom s jedním seznamem</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">b</span><span class=\"p\">)</span>\n<span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">append</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\">b</span><span class=\"p\">)</span>\n</pre></div><h2>Další způsoby, jak měnit seznamy</h2>\n<p>Kromě metody <code>append</code>, která přidává jediný prvek na konec, existuje\nspousta metod, které mění seznamy.\nVšechny udělají přímo v daném seznamu, a (kromě <code>pop</code>) vrací <code>None</code>:</p>\n<ul>\n<li><code>extend()</code> přidá více prvků najednou,</li>\n<li><code>insert()</code> přidá prvek na danou pozici,</li>\n<li><code>pop()</code> odebere <em>a vrátí</em> poslední prvek,</li>\n<li><code>remove()</code> odstraní první výskyt daného prvku,</li>\n<li><code>sort()</code> seznam seřadí (řetězce “podle abecedy”, čísla vzestupně),</li>\n<li><code>reverse()</code> obrátí pořadí prvků,</li>\n<li><code>clear()</code> odstraní všechny prvky.</li>\n</ul>\n<p><span class=\"figure\"><a href=\"/2019/brno-jaro-2019-pondeli/beginners/list/static/methods.svg\"><img src=\"/2019/brno-jaro-2019-pondeli/beginners/list/static/methods.svg\" alt=\"Tahák\"></a></span></p>\n<p>Například:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">zviratka</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">'pes'</span><span class=\"p\">,</span> <span class=\"s1\">'kočka'</span><span class=\"p\">,</span> <span class=\"s1\">'králík'</span><span class=\"p\">]</span>\n<span class=\"n\">zviratka</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"s1\">'morče'</span><span class=\"p\">)</span> <span class=\"c1\"># ['pes', 'kočka', 'králík', 'morče']</span>\n<span class=\"n\">zviratka</span><span class=\"o\">.</span><span class=\"n\">insert</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"s1\">'had'</span><span class=\"p\">)</span> <span class=\"c1\"># ['pes', 'kočka', 'had', 'králík', 'morče']</span>\n<span class=\"n\">zviratka</span><span class=\"o\">.</span><span class=\"n\">pop</span><span class=\"p\">()</span> <span class=\"c1\"># ['pes', 'kočka', 'had', 'králík'], vrátí 'morče'</span>\n<span class=\"n\">zviratka</span><span class=\"o\">.</span><span class=\"n\">remove</span><span class=\"p\">(</span><span class=\"s1\">'had'</span><span class=\"p\">)</span> <span class=\"c1\"># ['pes', 'kočka', 'králík']</span>\n<span class=\"n\">zviratka</span><span class=\"o\">.</span><span class=\"n\">sort</span><span class=\"p\">()</span> <span class=\"c1\"># ['kočka', 'králík', 'pes']</span>\n<span class=\"n\">zviratka</span><span class=\"o\">.</span><span class=\"n\">reverse</span><span class=\"p\">()</span> <span class=\"c1\"># ['pes', 'králík', 'kočka']</span>\n<span class=\"n\">zviratka</span><span class=\"o\">.</span><span class=\"n\">clear</span><span class=\"p\">()</span> <span class=\"c1\"># []</span>\n</pre></div><h2>Vybírání ze seznamů</h2>\n<p>Často budeš ze seznamu chtít vybrat prvek na určité pozici.\nTo funguje jako u řetězců: do hranatých závorek dáš číslo prvku.\nStejně jako u řetězců se čísluje od nuly a záporná čísla označují prvky\nod konce.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">zviratka</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">'pes'</span><span class=\"p\">,</span> <span class=\"s1\">'kočka'</span><span class=\"p\">,</span> <span class=\"s1\">'králík'</span><span class=\"p\">]</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zviratka</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">])</span>\n</pre></div><p>Hranatými závorkami můžeš získat i podseznam.\n<a href=\"/2019/brno-jaro-2019-pondeli/beginners/str/#slicing-diagram\">Diagram z materiálů k řetězcům</a>\nukazuje, jak u takového „sekání” číslovat:\nfunguje to stejně, jen místo menšího řetězce\ndostaneš menší seznam.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zviratka</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">:</span><span class=\"o\">-</span><span class=\"mi\">3</span><span class=\"p\">])</span>\n</pre></div><p>„Sekáním“ vzniká nový seznam – když pak ten původní změníš, v podseznamu se\nto neprojeví.</p>\n<h3>Měnění prvků</h3>\n<p>Na rozdíl od řetězců (které se nedají měnit) můžeš u existujících seznamů\nnastavovat konkrétní prvky – a to tak, že do prvku přiřadíš jako by to byla\nproměnná:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">zviratka</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">'pes'</span><span class=\"p\">,</span> <span class=\"s1\">'kočka'</span><span class=\"p\">,</span> <span class=\"s1\">'králík'</span><span class=\"p\">]</span>\n<span class=\"n\">zviratka</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">'koťátko'</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zviratka</span><span class=\"p\">)</span>\n</pre></div><p>Přiřazovat se dá i do podseznamu – v tomto případě\nse podseznam nahradí jednotlivými prvky z toho,\nco přiřadíš.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">zviratka</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">'pes'</span><span class=\"p\">,</span> <span class=\"s1\">'kočka'</span><span class=\"p\">,</span> <span class=\"s1\">'králík'</span><span class=\"p\">,</span> <span class=\"s1\">'had'</span><span class=\"p\">,</span> <span class=\"s1\">'andulka'</span><span class=\"p\">]</span>\n<span class=\"k\">print</span><span class=\"p\">([</span><span class=\"mi\">1</span><span class=\"p\">:</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">])</span>\n<span class=\"n\">zviratka</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">'koťátko'</span><span class=\"p\">,</span> <span class=\"s1\">'králíček'</span><span class=\"p\">,</span> <span class=\"s1\">'hádě'</span><span class=\"p\">]</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zviratka</span><span class=\"p\">)</span>\n</pre></div><h3>Mazání prvků</h3>\n<p>Přiřazením do podseznamu se dá i změnit délka\nseznamu, nebo některé prvky úplně odstranit:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">zviratka</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">'pes'</span><span class=\"p\">,</span> <span class=\"s1\">'kočka'</span><span class=\"p\">,</span> <span class=\"s1\">'králík'</span><span class=\"p\">]</span>\n<span class=\"n\">zviratka</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">'had'</span><span class=\"p\">,</span> <span class=\"s1\">'ještěrka'</span><span class=\"p\">,</span> <span class=\"s1\">'drak'</span><span class=\"p\">]</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zviratka</span><span class=\"p\">)</span>\n<span class=\"n\">cisla</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zviratka</span><span class=\"p\">)</span>\n</pre></div><p>Tenhle zápis pro mazání prvků je ale docela\nnepřehledný, a proto na to máme zvláštní příkaz jménem <code>del</code>.\nJak už jeho název (z angl. <em>delete</em>, smazat)\nnapovídá, smaže, co mu přijde pod ruku – jednotlivé\nprvky seznamů, podseznamy, … a dokonce i proměnné!</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">zviratka</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">'pes'</span><span class=\"p\">,</span> <span class=\"s1\">'kočka'</span><span class=\"p\">,</span> <span class=\"s1\">'králík'</span><span class=\"p\">,</span> <span class=\"s1\">'had'</span><span class=\"p\">,</span> <span class=\"s1\">'ještěrka'</span><span class=\"p\">,</span> <span class=\"s1\">'andulka'</span><span class=\"p\">]</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zviratka</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">])</span>\n<span class=\"k\">del</span> <span class=\"n\">zviratka</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zviratka</span><span class=\"p\">)</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zviratka</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">])</span>\n<span class=\"k\">del</span> <span class=\"n\">zviratka</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zviratka</span><span class=\"p\">)</span>\n\n<span class=\"k\">del</span> <span class=\"n\">zviratka</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zviratka</span><span class=\"p\">)</span>\n</pre></div><p>Nebo můžeš použít mazací metody zmíněné výše:</p>\n<ul>\n<li><code>pop</code>, která odstraní <em>a vrátí</em> poslední prvek v seznamu,</li>\n<li><code>remove</code>, která najde v seznamu první výskyt daného prvku a odstraní ho,</li>\n<li><code>clear</code>, která vyprázdní celý seznam.</li>\n</ul>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">balicek</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">'eso'</span><span class=\"p\">,</span> <span class=\"s1\">'sedma'</span><span class=\"p\">,</span> <span class=\"s1\">'svršek'</span><span class=\"p\">,</span> <span class=\"s1\">'sedma'</span><span class=\"p\">,</span> <span class=\"s1\">'král'</span><span class=\"p\">]</span>\n<span class=\"n\">liznuta_karta</span> <span class=\"o\">=</span> <span class=\"n\">karty</span><span class=\"o\">.</span><span class=\"n\">pop</span><span class=\"p\">()</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">liznuta_karta</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">balicek</span><span class=\"p\">)</span>\n\n<span class=\"n\">balicek</span><span class=\"o\">.</span><span class=\"n\">remove</span><span class=\"p\">(</span><span class=\"s1\">'sedma'</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">balicek</span><span class=\"p\">)</span>\n\n<span class=\"n\">balicek</span><span class=\"o\">.</span><span class=\"n\">clear</span><span class=\"p\">()</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">balicek</span><span class=\"p\">)</span>\n</pre></div><h2>Řazení</h2>\n<p>A taky tu máme metodu <code>sort</code>, která prvky seznamu seřadí.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">seznam</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"mi\">7</span><span class=\"p\">,</span> <span class=\"mi\">8</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"mi\">8</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">]</span>\n<span class=\"n\">seznam</span><span class=\"o\">.</span><span class=\"n\">sort</span><span class=\"p\">()</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">seznam</span><span class=\"p\">)</span>\n</pre></div><p>Aby se daly seřadit, musí být prvky seznamu vzájemně\n<em>porovnatelné</em> – konktrétně na ně musí fungovat\noperátor <code><</code>.\nSeznam s mixem čísel a řetězců tedy seřadit nepůjde.\nOperátor <code><</code> definuje i\njak přesně se řadí (např. čísla podle velikosti;\nřetězce podle speciální „abecedy” která řadí\nvelká písmena za malá, česká až za anglická, atd.).</p>\n<p>Metoda <code>sort</code> zná pojmenovaný argument\n<code>reverse</code>. Pokud ho nastavíš na <em>True</em>, řadí se „naopak”.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">seznam</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"mi\">7</span><span class=\"p\">,</span> <span class=\"mi\">8</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"mi\">8</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">]</span>\n<span class=\"n\">seznam</span><span class=\"o\">.</span><span class=\"n\">sort</span><span class=\"p\">(</span><span class=\"n\">reverse</span><span class=\"o\">=</span><span class=\"bp\">True</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">seznam</span><span class=\"p\">)</span>\n</pre></div><h2>Známé operace se seznamy</h2>\n<p>Spousta toho, co můžeme dělat s řetězci, má stejný\núčinek i u seznamů.\nTřeba sečítání a násobení číslem:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">melodie</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">'C'</span><span class=\"p\">,</span> <span class=\"s1\">'E'</span><span class=\"p\">,</span> <span class=\"s1\">'G'</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"mi\">2</span> <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"s1\">'E'</span><span class=\"p\">,</span> <span class=\"s1\">'E'</span><span class=\"p\">,</span> <span class=\"s1\">'D'</span><span class=\"p\">,</span> <span class=\"s1\">'E'</span><span class=\"p\">,</span> <span class=\"s1\">'F'</span><span class=\"p\">,</span> <span class=\"s1\">'D'</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"mi\">2</span> <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"s1\">'E'</span><span class=\"p\">,</span> <span class=\"s1\">'D'</span><span class=\"p\">,</span> <span class=\"s1\">'C'</span><span class=\"p\">]</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">melodie</span><span class=\"p\">)</span>\n</pre></div><p>Stejně jako u řetězců, sečítat jde jen seznam\nse seznamem – ne třeba seznam s řetězcem.</p>\n<p>Další staří známí jsou funkce <code>len</code>,\nmetody <code>count</code> a <code>index</code>, a operátor <code>in</code>.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">melodie</span><span class=\"p\">))</span> <span class=\"c1\"># Délka seznamu</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">melodie</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">(</span><span class=\"s1\">'D'</span><span class=\"p\">))</span> <span class=\"c1\"># Počet 'D' v seznamu</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">melodie</span><span class=\"o\">.</span><span class=\"n\">index</span><span class=\"p\">(</span><span class=\"s1\">'D'</span><span class=\"p\">))</span> <span class=\"c1\"># Číslo prvního 'D'</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'D'</span> <span class=\"ow\">in</span> <span class=\"n\">melodie</span><span class=\"p\">)</span> <span class=\"c1\"># Je 'D' v seznamu?</span>\n</pre></div><p>Poslední tři se ale přece jen chovají kapku jinak:\nu řetězců pracují s <em>podřetězci</em>,\nu seznamů jen s <em>jednotlivými</em> prvky.\nTakže ačkoliv naše melodie obsahuje prvky\n<code>'D'</code> a <code>'E'</code> vedle sebe, <code>'DE'</code> v seznamu není:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'DE'</span> <span class=\"ow\">in</span> <span class=\"n\">melodie</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">melodie</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">(</span><span class=\"s1\">'DE'</span><span class=\"p\">))</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">melodie</span><span class=\"o\">.</span><span class=\"n\">index</span><span class=\"p\">(</span><span class=\"s1\">'DE'</span><span class=\"p\">))</span>\n</pre></div><h2>Seznam jako podmínka</h2>\n<p>Seznam se dá použít v příkazu <code>if</code> (nebo <code>while</code>) jako podmínka,\nkterá platí, když v tom seznamu něco je.\nJinými slovy, <code>seznam</code> je tu „zkratka“ pro <code>len(seznam) > 0</code>.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">if</span> <span class=\"n\">seznam</span><span class=\"p\">:</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'V seznamu něco je!'</span><span class=\"p\">)</span>\n<span class=\"k\">else</span><span class=\"p\">:</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">'Seznam je prázdný!'</span><span class=\"p\">)</span>\n</pre></div><p>Podobně se dají v podmínce použít i řetězce.\nA dokonce i čísla – ta jako podmínka platí, pokud jsou nenulová.</p>\n<h2>Tvoření seznamů</h2>\n<p>Tak jako funkce <code>int</code> převádí na\ncelá čísla a <code>str</code> na řetězce,\nfunkce <code>list</code> (angl. <em>seznam</em>) převádí na seznam.\nJako argument jí předáme jakoukoli hodnotu,\nkterou umí zpracovat příkaz <code>for</code>.\nZ řetězců udělá seznam znaků, z otevřeného souboru\nudělá seznam řádků, z <code>range</code> udělá\nseznam čísel.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">abeceda</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"s1\">'abcdefghijklmnopqrstuvwxyz'</span><span class=\"p\">)</span>\n<span class=\"n\">cisla</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">100</span><span class=\"p\">))</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">abeceda</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">cisla</span><span class=\"p\">)</span>\n</pre></div><p>I ze seznamu udělá funkce <code>list</code> seznam.\nTo může znít zbytečně, ale není – vytvoří se\ntotiž <em>nový</em> seznam.\nBude mít sice stejné prvky ve stejném pořadí,\nale nebude to ten samý seznam:\nměnit se bude nezávisle na tom starém.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">]</span>\n<span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">)</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">b</span><span class=\"p\">)</span>\n<span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">append</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\">b</span><span class=\"p\">)</span>\n</pre></div><p>Další způsob, jak tvořit seznamy\n(zvláště složitější), je nejdřív udělat prázdný\nseznam a pak ho postupně naplnit pomocí funkce <code>append</code>.\nTřeba pokud z nějakého důvodu chceš seznam\nmocnin dvou, projdi čísla, kterými chceme mocnit,\ncyklem <code>for</code> a pro každé z nich\ndo seznamu přidej příslušnou mocninu:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">mocniny_dvou</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n<span class=\"k\">for</span> <span class=\"n\">cislo</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">10</span><span class=\"p\">):</span>\n <span class=\"n\">mocniny_dvou</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"mi\">2</span> <span class=\"o\">**</span> <span class=\"n\">cislo</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">mocniny_dvou</span><span class=\"p\">)</span>\n</pre></div><p>Chceš-li seznam, který reprezentuje balíček karet,\nzavolej <code>append</code> pro všechny kombinace barev a hodnot.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">balicek</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n<span class=\"k\">for</span> <span class=\"n\">barva</span> <span class=\"ow\">in</span> <span class=\"s1\">'♠'</span><span class=\"p\">,</span> <span class=\"s1\">'♥'</span><span class=\"p\">,</span> <span class=\"s1\">'♦'</span><span class=\"p\">,</span> <span class=\"s1\">'♣'</span><span class=\"p\">:</span> <span class=\"c1\"># (Na Windows použij textová jména)</span>\n <span class=\"k\">for</span> <span class=\"n\">hodnota</span> <span class=\"ow\">in</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">11</span><span class=\"p\">))</span> <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"s1\">'J'</span><span class=\"p\">,</span> <span class=\"s1\">'Q'</span><span class=\"p\">,</span> <span class=\"s1\">'K'</span><span class=\"p\">,</span> <span class=\"s1\">'A'</span><span class=\"p\">]:</span>\n <span class=\"n\">balicek</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">hodnota</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">barva</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">balicek</span><span class=\"p\">)</span>\n</pre></div><h2>Seznamy a řetězce</h2>\n<p>Seznamy a řetězce jsou druhy „sekvencí”,\ntakže snad nepřekvapí, že se dá různě převádět\nz jednoho typu na druhý.\nFunkce <code>list</code> vytvoří z řetězce seznam znaků.\nKdyž chceme dostat seznam slov, použijeme\nna řetězci metodu <code>split</code> (angl. <em>rozdělit</em>):</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">slova</span> <span class=\"o\">=</span> <span class=\"s1\">'Tato věta je složitá, rozdělme ji na slova!'</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">()</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">slova</span><span class=\"p\">)</span>\n</pre></div><p>Metoda <code>split</code> umí brát i argument.\nPokud ho předáme, místo mezer (a nových řádků)\nse řetězec „rozseká” daným oddělovačem.\nTakže když máš nějaká data oddělená čárkami,\npoužíj <code>split</code> s čárkou:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">zaznamy</span> <span class=\"o\">=</span> <span class=\"s1\">'3A,8B,2E,9D'</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"s1\">','</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">zaznamy</span><span class=\"p\">)</span>\n</pre></div><p>Chceš-li spojit seznam řetězců zase dohromady\ndo jediného řetězce, použij metodu <code>join</code> (angl. <em>spojit</em>).\nPozor, tahle metoda se volá na <em>oddělovači</em>,\ntedy řetězci, kterým se jednotlivé kousky „slepí”\ndohromady; a jako argument bere seznam jednotlivých\nřetězců.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">veta</span> <span class=\"o\">=</span> <span class=\"s1\">' '</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">slova</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">veta</span><span class=\"p\">)</span>\n</pre></div><h2>Seznamy a náhoda</h2>\n<p>Modul <code>random</code> obsahuje dvě funkce, které se hodí k seznamům.\nJako <code>random.randrange</code>, obě mají něco\nspolečného s náhodou.</p>\n<p>Funkce <code>shuffle</code> seznam „zamíchá” – všechny prvky náhodně popřehází.\nJako metoda <code>sort</code> i funkce <code>shuffle</code> nic nevrací.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">import</span> <span class=\"nn\">random</span>\n\n<span class=\"n\">balicek</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n<span class=\"k\">for</span> <span class=\"n\">barva</span> <span class=\"ow\">in</span> <span class=\"s1\">'♠'</span><span class=\"p\">,</span> <span class=\"s1\">'♥'</span><span class=\"p\">,</span> <span class=\"s1\">'♦'</span><span class=\"p\">,</span> <span class=\"s1\">'♣'</span><span class=\"p\">:</span>\n <span class=\"k\">for</span> <span class=\"n\">hodnota</span> <span class=\"ow\">in</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">11</span><span class=\"p\">))</span> <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"s1\">'J'</span><span class=\"p\">,</span> <span class=\"s1\">'Q'</span><span class=\"p\">,</span> <span class=\"s1\">'K'</span><span class=\"p\">,</span> <span class=\"s1\">'A'</span><span class=\"p\">]:</span>\n <span class=\"n\">balicek</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">hodnota</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">barva</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">balicek</span><span class=\"p\">)</span>\n\n<span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">shuffle</span><span class=\"p\">(</span><span class=\"n\">balicek</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">balicek</span><span class=\"p\">)</span>\n</pre></div><p>A funkce <code>choice</code> ze seznamu vybere jeden náhodný prvek.\nS použitím seznamu tak můžeš třeba jednoduše vybrat tah pro hru\nkámen/nůžky/papír:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">import</span> <span class=\"nn\">random</span>\n<span class=\"n\">mozne_tahy</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">'kámen'</span><span class=\"p\">,</span> <span class=\"s1\">'nůžky'</span><span class=\"p\">,</span> <span class=\"s1\">'papír'</span><span class=\"p\">]</span>\n<span class=\"n\">tah_pocitace</span> <span class=\"o\">=</span> <span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">choice</span><span class=\"p\">(</span><span class=\"n\">mozne_tahy</span><span class=\"p\">)</span>\n</pre></div><h2>Vnořené seznamy</h2>\n<p>A perlička na konec!\nNa začátku tohoto textu je napsáno, že seznam\nmůže obsahovat jakýkoli typ hodnot.\nMůže třeba obsahovat i další seznamy:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">seznam_seznamu</span> <span class=\"o\">=</span> <span class=\"p\">[[</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">],</span> <span class=\"p\">[</span><span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">6</span><span class=\"p\">],</span> <span class=\"p\">[</span><span class=\"mi\">7</span><span class=\"p\">,</span> <span class=\"mi\">8</span><span class=\"p\">,</span> <span class=\"mi\">9</span><span class=\"p\">]]</span>\n</pre></div><p>Takový seznam se chová docela normálně – jdou\nz něj třeba brát jednotlivé prvky\n(které jsou ovšem taky seznamy):</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">prvni_seznam</span> <span class=\"o\">=</span> <span class=\"n\">seznam_seznamu</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">prvni_seznam</span><span class=\"p\">)</span>\n</pre></div><p>A protože jsou prvky samy seznamy,\nmůžeme mluvit o věcech jako „první prvek druhého seznamu”:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">druhy_seznam</span> <span class=\"o\">=</span> <span class=\"n\">seznam_seznamu</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n<span class=\"n\">prvni_prvek_druheho_seznamu</span> <span class=\"o\">=</span> <span class=\"n\">druhy_seznam</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">prvni_prvek_druheho_seznamu</span><span class=\"p\">)</span>\n</pre></div><p>A protože výraz <code>seznam_seznamu[1]</code>\noznačuje seznam, můžeme brát prvky přímo z něj:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">prvni_prvek_druheho_seznamu</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">seznam_seznamu</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">])[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n</pre></div><p>Neboli:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">prvni_prvek_druheho_seznamu</span> <span class=\"o\">=</span> <span class=\"n\">seznam_seznamu</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">][</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n</pre></div><p>A má tahle věc nějaké použití, ptáš se?\nStejně jako vnořené cykly <code>for</code>\nnám umožnily vypsat tabulku, vnořené seznamy\nnám umožní si tabulku „zapamatovat”.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">vytvor_tabulku</span><span class=\"p\">(</span><span class=\"n\">velikost</span><span class=\"o\">=</span><span class=\"mi\">11</span><span class=\"p\">):</span>\n <span class=\"n\">seznam_radku</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n <span class=\"k\">for</span> <span class=\"n\">a</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">velikost</span><span class=\"p\">):</span>\n <span class=\"n\">radek</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n <span class=\"k\">for</span> <span class=\"n\">b</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">velikost</span><span class=\"p\">):</span>\n <span class=\"n\">radek</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">a</span> <span class=\"o\">*</span> <span class=\"n\">b</span><span class=\"p\">)</span>\n <span class=\"n\">seznam_radku</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">radek</span><span class=\"p\">)</span>\n <span class=\"k\">return</span> <span class=\"n\">seznam_radku</span>\n\n<span class=\"n\">nasobilka</span> <span class=\"o\">=</span> <span class=\"n\">vytvor_tabulku</span><span class=\"p\">()</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">nasobilka</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">][</span><span class=\"mi\">3</span><span class=\"p\">])</span> <span class=\"c1\"># dva krát tři</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">nasobilka</span><span class=\"p\">[</span><span class=\"mi\">5</span><span class=\"p\">][</span><span class=\"mi\">2</span><span class=\"p\">])</span> <span class=\"c1\"># pět krát dva</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">nasobilka</span><span class=\"p\">[</span><span class=\"mi\">8</span><span class=\"p\">][</span><span class=\"mi\">7</span><span class=\"p\">])</span> <span class=\"c1\"># osm krát sedm</span>\n\n<span class=\"c1\"># Vypsání celé tabulky</span>\n<span class=\"k\">for</span> <span class=\"n\">radek</span> <span class=\"ow\">in</span> <span class=\"n\">nasobilka</span><span class=\"p\">:</span>\n <span class=\"k\">for</span> <span class=\"n\">cislo</span> <span class=\"ow\">in</span> <span class=\"n\">radek</span><span class=\"p\">:</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">cislo</span><span class=\"p\">,</span> <span class=\"n\">end</span><span class=\"o\">=</span><span class=\"s1\">' '</span><span class=\"p\">)</span>\n <span class=\"k\">print</span><span class=\"p\">()</span>\n</pre></div><p>Co s takovou „zapamatovanou” tabulkou?\nMůžeš si do ní uložit třeba pozice\nfigurek na šachovnici nebo křížků a koleček\nve <em>2D</em> piškvorkách.</p>\n\n\n " } } }