Seznamy a n-tice

Seznam je datový typ list. Pro začátek ho můžeme chápat jako několik libovolných hodnot oddělených čárkou, to celé zapsané v hranatých závorkách.

N-tice je datový typ tuple. Vypadá skoro jako seznam, ale píše se v kulatých závorkách. Narozdíl od seznamu ji po vytvoření už nejde měnit.

Základy

Seznamy a n-tice jde sčítat podobně jako řetězce, a zrovna tak z nich vybírat prvky a delší úseky indexováním v hranatých závorkách. Seznam se nerovná n-tici, ani když obsahují úplně totéž.

>>> l = [1, 2, 3] >>> l[1] = 10 >>> l [1, 10, 3] >>> t = (1, 2, 3) >>> t[1] = 10 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment >>> t + (4, 5) (1, 2, 3, 4, 5) >>> t (1, 2, 3) >>> [1, 2, 3] == (1, 2, 3) False

K n-tici jde přičíst nějakou jinou, přestože se nedají měnit. Později si ukážeme, že kvůli tomuhle rozporu je z hlediska jazyka zásadní rozdíl, jestli přičítáme k n-tici nebo k seznamu.

Převod typů

Něco můžete na seznam, respektive n-tici, převést voláním list(něco), resp. tuple(něco). Je to obdobný zápis, na jaký jsme zvyklí u řetězců, čísel a všeho dalšího. V tomto případě je potřeba, aby něco byla sekvence (správný pojem je iterable), jinak převod selže.

>>> tuple("12") ('1', '2') >>> tuple(12) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'int' object is not iterable

Poznámka k zápisu

Kulaté závorky se používají pro několik účelů (označují n-tici, volání funkce anebo prostě závorky ve výrazu). Jedna z vyplývajících obtíží je, že jedna samotná hodnota zapsaná v závorkách není n-ticí. V takovém případě se závorky ztratí, jako by nebyly, a to i když jich zavrstvíme několik. Abychom vyrobili n-tici s jedním prvkem, musíme před koncovou závorku napsat čárku.

>>> (1) + (1) 2 >>> (1,) + (1,) (1, 1)

Dlužno poznamenat, že n-tice s jedním prvkem nejsou vlastně k ničemu dobré.

Packing & unpacking

Hodnoty ze seznamu nebo n-tice jde rozbalit do proměnných oddělených čárkou a naopak. Stejným trikem se dá zařídit, aby funkce navracela dvě hodnoty (ve skutečnosti potom navrací dvojici).

Když chceme navzájem prohodit hodnoty ve dvou proměnných (zde a, b), v Pythonu je běžný zápis: a, b = b, a

Příklad. Napište funkci, která dostane jako parametr dvě čísla a navrátí ta samá čísla v pořadí to_větší, to_menší.

>>> usporadej(17, 31) (31, 17) Řešení. def usporadej(a, b): if a < b: a, b = b, a return a, b

Mohlo by se to tak zdát, ale parametry ve volání funkce nejsou zapackovaná n-tice. Umožňují totiž i složitější zápis – například file=soubor, s nímž se setkáme níže, a to n-tice nezvládají.

Podmínka in

Na seznamy a n-tice jde používat podmínku in: aby byla splněná, musí být hodnota na levé straně přímo prvkem dotyčného seznamu nebo n-tice. Všimněte si, že seznam znaků se v téhle situaci chová jinak než řetězec. Následující ukázka se pokouší i naznačit důvod, proč tomu tak je: hodnotou v seznamu může být další seznam.

>>> "op" in "popel" True >>> ["o", "p"] in ["p", "o", "p", "e", "l"] False >>> ["o", "p"] in ("něco", ["o", "p"], "něco dalšího") True >>> ["o", "p"] in ["něco", ["o", "p"], "něco dalšího"] True

Jak už bylo zmíněno, prvky seznamů a n-tic můžeme procházet pomocí cyklu for. Když dáme například seznam do seznamu, považuje se při procházení za jeden prvek.

>>> for x in ["něco", ["o", "p"], "něco dalšího"]: ... print(x) ... něco ['o', 'p'] něco dalšího

Funkce list.append a list.pop

Na konec seznamu jde snadno přidat položku voláním seznam.append(něco). Volání funkce append nic nevrací, jen se změní obsah dotyčného seznamu. Poslední prvek jde ze seznamu utrhnout voláním seznam.pop() a funkce rovnou navrátí tenhle prvek, který utrhla. Tyhle dvě funkce se náramně hodí pro strukturu last-in-first-out, můžeme si tak například zapisovat odbočky, když hledáme cestu bludištěm. K tématu si povíme časem víc. N-tice takové funkce nemají, protože nejdou měnit.

Příklad. Vyrobte seznam, pro který bude platit seznam in seznam.

Řešení. sez = list() sez.append(sez)

Slovníky

Slovník je datový typ dict a chová se trochu podobně jako seznam. Rozdíl je především v tom, že indexy (zde se jim říká klíče) nemusí být jen čísla: může to být skoro jakákoliv hodnota, například řetězec. (Později probereme podrobně, které datové typy smí být klíč hodnot ve slovníku – stručně, jsou to ty, které nejdou měnit.)

Základní zápis slovníku je ve složených závorkách jako seznam dvojic klíč: hodnota, oddělených čárkou. Prázdný slovník je lepší psát jako dict().

Slovník může opravdu sloužit jako slovník v lidském významu:

>>> cs2sk = {"borůvka": "čučoriedka", "veverka": "drevokocúr"} >>> cs2sk["borůvka"] 'čučoriedka'

Slovník nepodporuje indexování s dvojtečkou.

Když zavoláme for cyklus na slovník přímo, budou se procházet jen klíče. Pak můžeme samozřejmě získat příslušné hodnoty ze slovníku ručně. Alternativou je použít funkci dict.items(), která navrací rovnou sekvenci dvojic (klíč, hodnota).