Práce s textem, chroustání seznamů

Přidáme nový datový typ, který nám umožní pracovat s textem a naučíme se zpracovávat seznamy.

V předchozí kapitole jsme si představili tři důležité typy hodnot: celá čísla, desetinná čísla a seznamy. Dnes přidáme další důležitý typ hodnot, abychom v Pythonu mohli pracovat nejen s čísly, ale i s texty.

Řetězce

Pokud chceme v Pythonu zadat nějak kousek textu, použijeme takzvaný stringřetězec. Řetězce se v Pythonu uzavírají do jednoduchých nebo dvojitých uvozovek. Například:

>>> 'martin'
>>> '12. března 2018'
>>> "prací prášek"
>>> "Don't panic"

Řetězce se chovají v něčem podobně jako čísla a v něčem podobně jako seznamy. Můžeme je například sčítat

>>> jmeno = 'martin' + ' ' + 'podloucký'

Můžeme však také přistupovat k jednotlivým písmenům nebo pracovat s podřetězci.

>>> jmeno[3]
't'
>>> jmeno[:6]
'martin'
>>> jmeno[7:]
'podloucký'

Podobně jako u seznamů můžeme na řetězcích volat také funkci len()

>>> len(jmeno)
16

Jelikož řetězec je opět hodnota jako každá jiná, není problém vyrobit seznam řetězců

>>> jmena = ['martin', 'jana', 'petr', 'simona']

Převody hodnot

Do této chvíle jsme viděli čtyři typy hodnot: celá čísla, desetinná čísla, řetězce a seznamy. Je velmi důležité se naučit vždy si dobře uvědomovat hodnotu jakého typu máme v proměnné zrovna uloženou.

Uvažte proměnnou definovanou takto

>>> vek = '18'

Všimněte si, že číslo 18 je uzavřeno v uvozovkách. To znamená, že jej Python chápe jako kus textu, tedy sekvenci symbolů 1 a 8. Pythonu nezáleží na tom, jaké symboly používáte uvnitř řetězců, písmenka jsou pro něj totéž jako číslice. Řetězec '18' je pro něj tedy skoro totéž jako 'ahoj' nebo 'Petr', prostě nějaký kousek textu.

Pokud se tedy pokusíte například o takovýto výpočet

>>> vek + 5

obdržíte od Pythonu chybu:

Traceback (most recent call last):
File "<stdin>", line 1, in
TypeError: Can't convert 'int' object to str implicitly

Touto zprávou se nám snaží Python říct, že neví, jak má sečíst řetězec a číslo. Python umí sečíst dvě čísla nebo dva řetězce, ale sčítat řetězec a číslo je jako byste po něm chtěli spočítat 'ahoj' + 1. Takový výpočet nedává smysl.

Převod z řetězce na číslo a zpět

S výše uvedeným problémem si můžeme poradit pomocí několika nových funkcí. První se jmenuje int(). Pokud této funkci dáte řetězec, jenž obsahuje celé číslo, vrátí vám tato funkce hodnotu typu celé číslo.

>>> int('18')
18

Podobně můžete použít funkci float() na řetězce obsahující desetinná čísla.

>>> float('3.14')
3.14

Často také budeme potřebovat převést nějakou hodnotu na řetězec. K tomu nám slouží funkce str(). Mějme například takového proměnné:

>>> hodin = 12
>>> minut = 35

Chceme-li vyrobit hezky vypadající čas ve formátu 12:35, použijeme funkci str() takto:

>>> str(hodin) + ':' + str(minut)
'12:35'

Metody

V minulé lekci jsme viděli takzvané funkce, které za nás vykonávají často opakované činnosti jako například zaokrouhlování, zjišťování délky seznamu apod. Některé funkce se však hodí na práci pouze s jedním typem hodnoty. Například bychom mohli mít funkci upper(), která by převedla všechna písmena v řetězci na velká písmena. Kdyby taková funkce existovala, mohli bychom ji volat třeba takto

>>> upper('martin')
'MARTIN'

Je pochopitelné, že taková funkce funguje pouze pro řetězce. Pro ostatní hodnoty nedává smysl. Těžko si představit, co by taková funkce měla vrátit například v takovémto případě:

>>> upper(3.14)

Funkce, které pracují pouze na jednom typu hodnoty, se programátoři Pythonu rozhodli svázat přímo s touto hodnotu. Můžeme tedy říct, že funkce upper() patří řetězcům. Pokud tedy máme nějaký řetězec, funkci, která patří pouze k typu řetězec, zavoláme pomocí takzvané tečkové notace.

>>> 'martin'.upper()
'MARTIN'

Funkcím, které patří jen konkrétním typům hodnot, říkáme metody. Všimněte si, že metoda upper() pro řetězce v Pythonu skutečně existuje, takže výše uvedený kód bude opravdu fungovat. Podobně existuje například metoda lower(). Vyzkoušejte si ji.

Užitečné metody na řetězcích

strip() : Odstraní všechny bílé znaky na začátku a konci řetězce

>>> '  martin   '.strip()
'martin'

split(sep) : Rozseká řetězec na kousky podle zadaného oddělovače sep. Např.

>>> 'po ut st čt pá'.split(' ')
['po', 'ut', 'st', 'čt', 'pá']

nebo

>>> '3.12,4.1,9.6,-127,0'.split(',')
['3.12', '4.1', '9.6', '-127', '0']
>>> '3.12,4.1,9.6,-127,0'.split('.')
['3', '12,4', '1,9', '6,-127,0']

join(list) : Spojí řetězce v seznamu list do jednoho velkého řetězce podle zadaného separátoru.

>>> '+'.join(['1', '2', '3', '4'])
'1+2+3+4'
>>> '/'.join(['dokumenty', 'dapraha', 'python', 'priklady'])
'dokumenty/dapraha/python/priklady'

Cvičení: Řetězce, metody

1

Převod písmen

pohodička

Uložte si do proměnné jmeno svoje jméno. Pomocí volání vhodných metod jej převeďte nejdříve na všechna písmena malá a poté na všechna písmena velká.

2

Mějme seznam desetinných čísel zadaných jako text

hodnoty = ['12', '1', '7', '-11']

Potřebujeme k třetímu číslu v seznamu přičíst 4, aby výsledek vypadal takto:

hodnoty = ['12', '1', '11', '-11']

Před tím, než se podíváte na následující kroky, sami si rozmyslete postup, jak toto provést. Až když si nejste jistí, pokračujte podle následujících kroků.

  1. Uložte si hodnotu na třetí pozici v seznam do nějaké proměnné.
  2. Převeďte tuto hodnotu na číslo a přičtěte k němu 4. Výsledek uložte do proměnné vysledek.
  3. Převeďte hodnotu v proměnné vysledek zpět na řetězec a uložte ji na třetí pozici v seznamu hodnoty.
3

Máme obdobné zadání jako v předchozím cvičení, avšak tentokrát máme čísla zadána nikoliv v seznamu ale v řetězci oddělená mezerou:

hodnoty = '12.1 1.68 7.45 -11.51'

K poslednímu číslu v seznamu chceme přičíst 0.25 tak, aby výsledek vypadal takto

hodnoty = '12.1 1.68 7.45 -11.26'

Určitě se vám budou hodit metody split a join.

Bonusy

4

Zkuste vymyslet, jak udělat zápis příkazů ze cvičení Čísla jako text co nejúspornější. Dá se dojít až k tomu, že celé řešení bude na jeden řádek v Python konzoli.