Seznamy
Zatím jsme pracovali s čísly (jak celými tak desetinnými) a řetězci. Ty vždy reprezentovaly jednu konkrétní “věc”; co kdybychom ale chtěli reprezentovat soubor nějakých “věcí”, třeba jaké mince máme v peněžence nebo jména studentů ve třídě?
V Pythonu taková data můžeme zapsat pomocí seznamů (anglicky list, česky někdy též pole).
penezenka = [2, 2, 5, 5, 5, 20, 20, 50, 50]
studenti = ["Martin", "Dan", "Adam", "Edvard", "Richard", "Martina", "Káťa", "Ondřej"]
Pole zapisujeme pomocí hranatých závorek, ve kterých jsou jednotlivé prvky oddělené čárkou. V poli můžeme prvky libovolně opakovat, jak vidíme v případě s mincemi v peněžence (jejich vzestupné seřazení ale pole nezaručuje).
Užitečnou vlastností seznamů je, že jimi můžeme iterovat pomocí cyklů:
for mince in penezenka:
print(mince)
V proměnné mince se postupně objevují všechny prvky seznamu penezenka.
Někdy se hodí znát délku seznamu, tedy kolik prvků obsahuje. K tomu slouží magické slovíčko len. Délka prázdného
seznamu je 0.
print(penezenka)
print(studenti)
print(len(penezenka))
print(len(studenti))
K prvkům seznamu nemusíme přistupovat jen hromadně pomocí cyklu, ale i náhodně1. Každý prvek má svoje pořadní číslo,
říkáme mu index, které začíná od 0. První prvek má tedy index 0, druhý index 1, atd. K získání hodnoty na daném indexu
používáme hranaté závorky [] za jménem proměnné, ve které je náš seznam. Speciálně pak index hodnoty -1 vrací poslední
prvek seznamu, -2 předposlední, a tak dále.
print(studenti[0])
print(studenti[1])
print(studenti[-1])
Takto můžeme iterovat polem i pomocí for cyklu s range. To se teď může zdát nepotřebné, ale občas potřebujeme ze
seznamu získat všechny hodnoty na nějakých indexech, které se dají vyjádřit nějakou posloupností (buď vyjadřitelnou
range, nebo seznamem indexů).
for i in range(len(studenti)):
print(studenti[i])
Pro pole existuje spousta užitečných magických slovíček, které nám o polích řeknou tížené informace:
min(pole)nám vrátí nejmenší hodnotu v poli,max(pole)nám vrátí největší hodnotu v poli- a
sum(pole)nám vrátí součet všech hodnot v poli.
Prázdné pole můžeme založit pomocí přiřazení prázdného seznamu do proměnné:
znamky = []
Do pole můžeme přidávat prvky pomocí volání2 append:
znamky.append(2)
znamky.append(3)
Important
Zkuste si pomocí hranatých závorek zkusit přistoupit k prvku na indexu, který neexistuje (třeba proto, že je pole moc krátké). Python na vás zakřičí výjimku typu
IndexError. Výjimky jsou prostředek komunikace chyb v programu, které nastaly během jeho běhu. V kurzu je ještě uvidíme.
Můžeme takto třeba přidat všem studentům známku pět, protože úkol nikdo neodevzdal:
for student in studenti:
znamky.append(5)
Také by se hodilo umět ověřit, zda prvek je nebo není v seznamu. K tomu slouží klíčové slovo in a vrací hodnotu
typu boolean (tedy podmínka). Můžeme tedy ověřit, jestli je někdo studentem nebo ne:
mozni_studenti = ["Jan", "Petr", "Honza", "Marie"]
for mozny_student in mozni_studenti:
if mozny_student in studenti:
print(f"{mozny_student} je studentem")
else:
print(f"{mozny_student} není studentem")
Pokud máme dva seznamy, můžeme je spojit pomocí operátoru +.
seznam1 = [1, 2, 3]
seznam2 = [4, 5, 6]
seznam3 = seznam1 + seznam2
print(seznam3)
Podívejme se nyní ještě jednou na řetězce (anglicky string). Jak název napovídá, řetězec není nic jiného než zřetězení znaků do jednoho uceleného objektu. Python na řetězce pohlíží jako na seznam znaků, a proto můžeme s řetězci dělat totéž, co se seznamy.
zprava = "Hello, world!"
print(zprava[0])
print(zprava[-1])
for znak in zprava:
print(znak)
Úlohy
Important
Při řešení úloh se zamyslete nad tím, jaký vstup může váš program přijímat. Také se snažte o vstupu nic nepředpokládat, pokud to není explicitně zmíněno v zadání. Je také třeba myslet na takzvané edge cases, hraniční případy: třeba to, že by program měl fungovat správně i s prázdným seznamem.
- Prázdné pole
- Rozmyslete si, jakou podmínkou můžeme vyjádřit to, že je nějaké pole prázdné. Ověřte.
- Poslední index
- Pomocí délky pole vyjádřete, jaké hodnoty bude nabývat index posledního prvku (v závislosti na délce pole)
- Analýza seznamu
- Napište vlastní implementace
min,maxasumpro seznamy. Použijte cyklus a nějakou podmínku. Stávájící hodnotu si pamatujte pomocí proměnné, kterou v cyklu buď aktualizujete, nebo ne. - Druhý nejvyšší prvek
- Napište program, který najde druhý nejvyšší prvek v seznamu. Předpokládáme, že seznam bude mít alespoň dva prvky.
- Deduplikace
- Na vstupu dostane program seznam, kde se mohou vyskytovat duplicitní prvky. Napište program, který tento seznam deduplikuje, tj. takové prvky odstraní. Výsledek bude tedy znovu seznam, klidně seznam nový.
-
Slovo “náhodně” zde není myšleno ve významu náhodnosti (například jako ve spojení “náhodné číslo”). Náhodný přístup k prvkům seznamu znamená, že jsme schopni se podívat na jakýkoli prvek seznamu. ↩
-
Zatím nerozebírejme, co znamená slovo “volání”. Berme zatím jako fakt, že můžeme napsat
.append(...)za proměnnou, ve které je seznam. ↩