Další Předchozí Obsah

5. Operace s lineárními strukturami

5.1 Společné operace

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).

5.2 Seznamy

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:

5.3 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é.

5.4 Řetězce

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


Další Předchozí Obsah