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.
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.
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
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é.
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í.
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
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
.
sez = list()
sez.append(sez)
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)
.