Řada skříněk

O čem to je

Ve škole máte na chodbě řadu očíslovaných skříněk. Každá má číslo a v každé něco je. Když chceš věc ze skříňky 3, nemusíš prohledávat všechny. Jdeš rovnou ke trojce.

Seznam je taková řada skříněk v paměti. Do jedné proměnné uložíš třeba známky celé třídy, nákupní seznam nebo skóre všech hráčů. Pak s nimi pracuješ najednou, nejčastěji cyklem.

Nové pojmy

Seznam (list)Uspořádaná řada hodnot v jedné proměnné. Zapisuje se do hranatých závorek, prvky odděluje čárka. Seznam jde měnit: přidávat, mazat i přepisovat prvky.znamky = [1, 3, 2, 1]
PrvekJedna hodnota v seznamu.V [1, 3, 2] jsou tři prvky.
IndexPořadové číslo prvku. Počítá se od nuly. Záporný index počítá od konce: −1 je poslední prvek.V a = [3, 1, 4] je a[0] = 3 a a[-1] = 4.
Délka len()Funkce, která vrátí počet prvků seznamu.len([3, 1, 4]) je 3.

Indexy

prvek31415
index01234
záporný index−5−4−3−2−1

Seznam a = [3, 1, 4, 1, 5] má 5 prvků. Indexy jdou od 0 do 4. Index 5 už neexistuje a a[5] skončí chybou IndexError.

Změny seznamu

ZápisCo uděláa = [3, 1, 4] potom
a[0] = 7přepíše prvek na indexu 0[7, 1, 4]
a.append(9)přidá prvek na konec[3, 1, 4, 9]
a.insert(0, 8)vloží prvek na index 0[8, 3, 1, 4]
a.remove(1)smaže první výskyt hodnoty 1[3, 4]
a.pop()odebere a vrátí poslední prvek[3, 1]

Průchod seznamem

  • znamky = [1, 3, 2, 1]
  • soucet = 0
  • for z in znamky:
  •     soucet = soucet + z
  • print(soucet / len(znamky))

Cyklus vezme postupně každou známku a přičte ji. Součet je 7, prvky jsou 4, vypíše průměr 1.75.

a = [3, 1, 4, 1, 5]. Co je a[2] a a[-2]?
Index 2 je třetí prvek: 4. Index −2 je druhý od konce: 1.
Najdi největší prvek bez funkce max().
nej = a[0], pak for x in a: → if x > nej: nej = x. Začneš prvním prvkem a každý větší si zapamatuješ. Pro [3, 1, 4, 1, 5] vyjde 5. (Python to umí i hotově: max(a).)
✗První prvek seznamu a je a[1].
✓První prvek je a[0], poslední a[len(a) - 1] neboli a[-1].

Indexy v Pythonu začínají nulou. Index říká, o kolik míst jsi od začátku.

Seznam je uspořádaná, měnitelná řada hodnot v [ ]. Indexy začínají nulou, −1 je poslední prvek. append přidává, remove a pop odebírají, for prochází všechny prvky.

Řezy a triky

O čem to je

Máš výsledky závodu jako seznam časů. Chceš první tři, chceš je seřadit, chceš jen časy pod minutu. Python na to má krátké zápisy, které ušetří spoustu řádků.

Naučíš se řezy, užitečné funkce a jednu záludnost: dvě proměnné mohou ukazovat na tentýž seznam.

Nové pojmy

Seznam a indexSeznam je řada hodnot v [ ], která jde měnit. Index je pořadí prvku od nuly, záporný od konce.casy = [58, 63, 49, 71], casy[0] je 58, casy[-1] je 71.
Řez (slice)Zápis a[od:do] vrátí nový seznam s prvky od indexu od do indexu do − 1. Vynechaná mez znamená začátek nebo konec. Třetí číslo je krok.casy[1:3] je [63, 49], casy[:2] je [58, 63], casy[::-1] je seznam pozpátku.
MetodaFunkce, která patří k hodnotě a volá se přes tečku.casy.sort() seřadí seznam casy na místě.
Odkaz (reference)Proměnná neobsahuje celý seznam, jen ukazuje, kde v paměti leží. Přiřazení b = a seznam nezkopíruje, jen vytvoří druhý odkaz na tentýž seznam.Po b = a a b.append(4) se změní i a.

Užitečné nástroje

ZápisVýsledek pro a = [3, 1, 4, 1, 5]
len(a)5
sum(a), max(a), min(a)14, 5, 1
sorted(a)nový seřazený seznam [1, 1, 3, 4, 5]
a.sort()seřadí přímo a, vrací None
a.count(1)2 (kolikrát je tam 1)
4 in aTrue
a + [9], [0] * 3spojení seznamů, opakování [0, 0, 0]

Generátorová notace (list comprehension)

Krátký zápis, jak z jednoho seznamu vyrobit jiný: [výraz for prvek in seznam if podmínka].

Co je [i * i for i in range(4)]?
Pro i = 0, 1, 2, 3 spočítá druhou mocninu: [0, 1, 4, 9].
Z casy = [58, 63, 49, 71] vyber jen časy pod 60.
[c for c in casy if c < 60] → [58, 49]. Totéž jako cyklus s if a append, jen na jednom řádku.

Seznam v seznamu

Prvkem seznamu může být zase seznam. Tak vznikne tabulka (matice). m = [[1, 2], [3, 4]]: m[1] je řádek [3, 4] a m[1][0] je 3.

  • a[1:3] pro a = [3, 1, 4, 1, 5] – [1, 4]
  • a[:2] – [3, 1]
  • a[-1] – 5
  • a[::-1] – [5, 1, 4, 1, 3]
  • len(a) – 5

Řekni si výsledek nahlas a teprve pak kartičku otoč.

✗b = a vytvoří kopii seznamu, takže b.append(4) změní jen b.
✓Kopii vytvoříš b = a.copy() nebo b = a[:].

b = a jen přidá druhé jméno k témuž seznamu. Změna přes jedno jméno je vidět i přes druhé.

Řez a[od:do] vrací prvky od od do do − 1. sorted() vrací nový seřazený seznam, sort() řadí na místě. b = a seznam nekopíruje, kopii udělá a.copy().