Jak bylo již zmíněno, z řetězce, seznamu i n-tice se dá pomocí indexu zjistit jeden znak. První prvek má index 0, indexy rostou vzestupně.
>>> s
'Toto je retezec'
>>> s[0]
'T'
>>> s[1]
'o'
>>> s[-1]
'c'
Zajímavá konstrukce je s[-1]
. Pokud je jako index použito záporné
číslo, začíná se počítat od konce. -1 je tedy poslední znak, ale
-0 je totéž, co 0. Kdo sáhne za hranice struktury (z libovolné
strany), bude odměněn výjimkou IndexError
.
Zajímavější je operátor slice. Do hranatých závorek se uvede počáteční a koncový index oddělené dvojtečkou.
>>> s[5:7]
'je'
>>> s[:-2]
'Toto je retez'
>>> s[8:]
'retezec'
>>> s[:]
'Toto je retezec'
Pokud je počáteční (resp.koncový) index vynechán, nahradí se začátkem (koncem) řetězce. Je dobré si vyzkoušet jak slice funguje na několika řetězcích, ze začátku může jeho chování vypadat poněkud zmateně.
Kromě jiného lze i zjišťovat délku struktury vestavěnou funkcí
len
, všechny struktury je možné sčítat mezi sebou a
násobit celým číslem.
>>> s1='Vesele'
>>> s2='vanoce'
>>> sum=s1+' '+s2
>>> sum
'Vesele vanoce'
>>> len(sum)
13
>>> 5*'!'
'!!!!!'
>>> 3*(None,)+(1,)
(None, None, None, 1)
Pro zpracování těchto struktur existují další vestavěné funkce a
operátory. Funkce min
a max
vrací nejmenší a největší
prvek. Operátor in
vrací 1 pokud se argument nachází ve struktuře,
0 v opačném případě. Operátor not in
funguje analogicky.
>>> min(427839,423423,55,33,77,1,3.14)
1
>>> max('Retezec')
'z'
>>> 's' in 'retezec'
0
>>> 'v' in 'velbloud'
1
>>> 1 not in [2, 3, 5, 7, 11, 13, 17, 19]
1
ADVANCED:
Vyhledávání je implementováno jako cyklus
for
. Nejprve se pomocí funkce len()
zjistí délku cyklu a poté
iteruje přes všechna přirozená čísla od 0
do len-1
. Končí se
v okamžiku, kdy je výsledek jasný (nalezení prvního).
Seznamy je možné modifikovat. Buď nahrazováním části listu jiným
nebo pomocí metod listu, především append
.
>>> l=[1,2,3,4,5,6,7,8,9]
>>> del l[2:5]
>>> print l
[1, 2, 6, 7, 8, 9]
>>> l[0] = -1
>>> l[2:2]=['Vlozeno']
>>> print l
[-1, 2, 'Vlozeno', 6, 7, 8, 9]
>>> l.append('Pripojeno')
>>> l[0:1]=[0, 0]
>>> print l
[0, 0, 2, 'Vlozeno', 6, 7, 8, 9, 'Pripojeno']
První příkaz smazal slice [2:5]
, další umístil na nultou pozici
číslo -1. Třetí příkaz vložil na místo slice [2:2]
list obsahující
řetězec. Metoda append
připojila k seznamu další prvek. Poslední
příkaz nahradil slice [0:1]
seznamem [0,0]
. Popletené?
List má kromě jiného i metodu sort
, která ho (in-place)
setřídí. Tato metoda nic nevrací.
>>> jezci=['Jezek', 'jezek', 'JEZEK', 'jezecek']
>>> print jezci
['Jezek', 'jezek', 'JEZEK', 'jezecek']
>>> jezci.sort()
>>> print jezci
['JEZEK', 'Jezek', 'jezecek', 'jezek']
>>> jezci.sort
<built-in method sort of list object at 80896f8>
Všimněte si, že při volání metody (a jakékoliv funkce) nepožadující parametry je třeba za jejím jménem napsat () - stejně jako v C. Pouhé jméno (metody) funkce se považuje za jméno instance funkce a Python udělá přesně, to co mu řeknete - vyhledá příslušnou instanci. (Časem se ukáže, že to je docela rafinované).
Nechť s, l jsou seznamy. Potom existují další metody:
s.append(x)
k seznamu s připojí prvek xs.extent(l)
k seznamu s připojí seznam l
(Existuje od verze 1.5 s poznámkou ``experimental'')s.count(x)
vrací počet výskytů x v seznamu ss.index(x)
vrací nejmenší index i takový,
že s[i] = x
, není-li takový, vyvolá výjimku
ValueError
s.remove(x)
ze seznamu zruší první výskyt x,
není-li takový, vyvolá výjimku ValueError
s.insert(i,x)
do seznamu na místo slice s[i:i]
vloží objekt xs.reverse()
in-place obrátí pořadí položek v seznamus.pop()
odebere ze seznamu poslední prvek a vrátí
tento prvek (Existuje od verze 1.5)s.pop(i)
odebere ze sezanmu i-tý prvek a vrátí ho
n
-tice
Sekvence se používají v případě, že nechceme, či nepotřebujeme s daty manipulovat, proto k nim neexistují metody, které by je mohly měnit.
ADVANCED:
Proto se sekvence označují jako
immutable tj. neměnitelné. Již jednou vytvořený objekt
n-tice nelze in-place změnit. Na jeho místo je ale možné zapsat jakýkoliv jiný
objekt. Další neměnitelné objekty jsou všechny číselné typy a řetězce.
Seznamy a slovníky jsou změnitelné.
K řetězcům existuje jediný operátor, který není u ostatních lineárních
struktur a to formátovací operátor %
. Řetězec na levé straně
operátoru je interpretován jako formátovací řetězec funkce sprintf
jazyka C. Na pravé straně je seznam nebo n-tice. Operátor %
vrací
to, co se nacházelo v řetězci, který by byl výstupem funkce
sprintf
.
>>> print "%i: %s" % (1, 'slon')
1: slon
>>> print "%g" % 3.1415926
3.14159
>>> print "%10s" % 10
10
>>> pocet, zvire, cena = 10, 'hroznýš', 17
>>> vystup = "%3ix %-20s %i" % (pocet, zvire, pocet*cena)
>>> print vystup
10x hroznýš 170
Podporovány jsou téměř všechny formátovací znaky z C s výjimkou %p
a %n
. Pokud se formátovací znak neshoduje s dodaným objektem, je
vyvolána výjimka TypeError
. Formátovací znak %s
je
robustnější, jakýkoliv objekt převádí na řetězec, není tedy problém
zapsat
>>> s = "%s" % 10
>>> s
'10'
ADVANCED:
Pro převod libovolného objektu na řetězec je
použita funkce str()
ADVANCED:
Pro složitější případe existuje možnost uvést na
pravé straně formátovacího operátoru slovník, a mezi procento v řetězci
a formátovací znak uvést klíč do slovníku.
>>> h = { 'login': 'root', 'uid': 0, 'home': '/root' }
>>> print "Uživatel %(login)s (uid %(uid)i) má home adresář (home)s" % h
Uživatel root (uid 0) má home adresář /root