Python - Seznamy, n-tice, slovníky, řetězce a iterátory

Z GeoWikiCZ

Součástí jazyka Python jsou kontejnery, které slouží pro ukládání různých objektů. S kontejnery úzce souvisí objekty, kterým říkáme iterátory. Standardní kontejnery Pythonu jsou seznamy (lists), n-tice (tuples), slovníky (dictionaries) a řetězce (strings).

Seznamy a n-tice

Jednoduchý seznam v Pythonu vytvoříme například takto

 ptaci = [ "sokol", "krahujec", "koroptev", "lelek" ]

počet prvků seznamu určuje funkce len(), k jednotlivým prvkům seznamu můžeme přistupovat přes indexy; indexem prvního prvku je 0, poslední prvek z našeho příkladu má index 3, resp. len(ptaci)-1. Cyklus

 for i in range(len(ptaci)):
    print ptaci[i]

vytiskne všechny ptáky z naše seznamu.

Jistou zvláštností Pythonu je, že povoluje i záporné indexy, kde ptaci[-1] je poslední prvek seznamu, v nešem případě tedy "lelek". Záporný index -n je v neprázdném seznamu definován jako výraz seznam[len(seznam)-n].

Kromě jednotlivých prvků seznamu, můžeme indexovat i výřezy (slicing), například výraz ptaci[1:3] označuje podseznam ["krahujec", "koroptev"]. Výřezy fungují i pro záporné indexy. Indexy na začátek, resp. konec seznamu lze vynechat a můžeme proto psát ptaci[:3] pro výřez ["sokol", "krahujec", "koroptev"], resp. ptaci[2:] pro výřez ["koroptev", "lelek"]. Vynecháním obou indexů ptaci[:] získáme výraz, který označuje celý seznam.

Hodnoty prvků seznamu můžeme měnit přiřazením, například

 ptaci[2] = "vrabec"

seznamy můžeme rozšiřovat anebo rušit jejich prvky. Jazyk Python kromě seznamů poskytují i tzv. n-tice (tuples), které se od seznamů liší tím, že nemohou být po vytvoření měněny. N-tice vytváříme jako seznamy uzavřené do oblých závorek

 tyden = ("pondeli", "utery",  "streda", "ctvrtek",
          "patek",   "sobota", "nedele" )

Jména dní v týdnů se nemění, jejich seznam je konstatní a v programu je obvykle budeme deklarovat jako n-tici. Při pokusu o změnu n-tice dojde za běhu programu k chybě.

Python nepožaduje aby všechny prvky seznamu, resp. n-tice, byly stejného typu, seznam může obsahovat další seznamy

 [ "retezec 1", 122, "retezec 2", 12.432, [1, 2 ,3] ]

Slovníky

Slovník je datový typ, kterému se někdy též říká asociativní pole. Na rozdíl od seznamů a n-tic, které jsou indexováný celými čísly (od nuly) přistupujeme k prvkům slovníku pomocí klíčů jako jsou například řetězce, čísla a pod. Můžeme například vytvořit a inicializovat telefonni seznam

 linka = {'Pavel':3526, 'Honza':3723, 'Eva':4263, 'Jirka':2393 }

Do slovníku tedy ukládáme dvojice klíč-hodnota, inicializační seznam je uzavřen ve složených závorkách. K jednotlivým prvkům přispujeme pomocí klíčů, nové klíče můžeme přidávat přiřazenim.

 print linka['Honza']
 linka['Ivo'] = 8722
 print linka

 3723
 {'Eva': 4263, 'Ivo': 8722, 'Honza': 3723, 'Jirka': 2393, 'Pavel': 3526}

Metoda keys vrací seznam klíčů v daném slovníku

 print linka.keys()
 ['Eva', 'Ivo', 'Honza', 'Jirka', 'Pavel']

Pokud chceme, aby klíče byly setříděny, musíme použít medotu sort()

 s = linka.keys()
 s.sort()
 print s
 for i in s:
     print i, ' ',

 Eva   Honza   Ivo   Jirka   Pavel

Metoda has_key() anebo operátor in umožňují určit, zda je daný klíč ve slovníku

 print
 print linka.has_key('Eva'),  '   ', 'Eva' in linka
 print linka.has_key('Hugo'), '   ', 'Hugo' in linka

 True     True
 False     False

Prázdný slovník vytvoříme přiřazením prázdného seznamu

 a = {}

Dvojici klíč-hodnota ve slovníku zrušíme operátorem del

 del linka['Pavel']

Řetězce

Řetězce v Pyhonu mohou být uzavřeny dvojicí uvozovek nebo dvojicí apostrofů

  a = 'jeden řetězec'
  b = "druhý řetězec"

Implicitní kódování Pythonu je ASCII, pokud ve skriptu pracujeme s jiným kódováním musíme je definovat na prvním nebo druhém komentářovém řádku

 #!/usr/bin/python
 # coding=utf-8
 
 print 'řetězec v kódování­ utf-8'

Dlouhé řetězce, které pokračují na více řádcích můžeme zapsat například takto

 print "Toto je dlouhý řetězec\n\
 který pokračuje ne několika řádcích\n\
    všimněte si. že úvodní mezery jsou významné"

Pro víceřádkové řetězce ale Python nabízí elegantnější konstrukci, kdy řetězec je uzavřen do trojic apostrofů nebo uvozovek (bez \n a \)

 print """Toto je dlouhý řetězec
 který pokračuje ne několika řádcích
    všimněte si. že úvodní mezery jsou významné"""

 Toto je dlouhý řetězec
 který pokračuje ne několika řádcích
    všimněte si. že úvodní mezery jsou významné

Prvky řetězce, tj. jednotlivé znaky, můžeme indexovat obdobně jako prvky seznamů.

Iterátory

[ Zpět ]