📘

Jožko Maťko poznámočky

Jožko Maťko poznámočky

1 Základná kostra programu

Každý Tkinter program začína importmi a vytvorením základného okna s plátnom (Canvas). Skratka as tk šetrí písanie – všade potom píšeš tk. namiesto tkinter..

python
import tkinter as tk
import random as rd  # Ak potrebuješ náhodné čísla alebo miešanie (shuffle)

SIRKA = 800
VYSKA = 600

root = tk.Tk()
root.title("Môj program")  # Nadpis okna (voliteľné)
canvas = tk.Canvas(root, width=SIRKA, height=VYSKA, background="white")
canvas.pack()

# ... Sem ide tvoj kód ...

root.mainloop()
💡
Konštanty SIRKA a VYSKA definuj vždy hore – budú sa ti hodiť pri výpočte stredu okna (SIRKA // 2), hraniciach pohybu, veľkosti mriežky atď.

2 Kreslenie na plátno (Canvas)

Plátno (canvas) je záchytný bod pre tvoje tvary. Súradnice: X rastie doprava, Y rastie nadol.

Obdĺžnik – create_rectangle

Vyžaduje 4 body: (x1, y1, x2, y2) – ľavý horný a pravý dolný roh.

python
canvas.create_rectangle(50, 50, 150, 100, fill="red", outline="black", width=2, tags="tvar")
# fill = farba výplne
# outline = farba obrysu
# width = hrúbka obrysovej čiary
# tags = menovka pre skupinové mazanie

Kruh / Elipsa – create_oval

Zadáva sa rovnako ako obdĺžnik, do ktorého by si túto elipsu vpísal.

python
canvas.create_oval(50, 50, 150, 150, fill="blue")

Čiara – create_line

Spájaj ľubovoľný počet bodov. Viac ako 2 body = lámané čiary.

python
# Jednoduchá priamka (napr. os)
canvas.create_line(0, 100, 800, 100, fill="red", width=3)

# Viac bodov = lámaná čiara (napr. zubatá línia)
canvas.create_line(100, 200, 150, 150, 200, 200, 250, 150, fill="black", width=2, tags="ciara")

Mnohouholník – create_polygon

Uzatvorený tvar zo série bodov. Ideálny pre nepravidelné tvary (napr. šípky).

python
# Nepravidelný mnohouholník
canvas.create_polygon(
    x-20, y,  x+20, y,  x+10, y+8,  x-10, y+8,
    fill="black", outline="white", tags="tvar"
)

Text na plátne – create_text

Vyžaduje len jeden bod (stred textu) X a Y. Defaultne sa text vycentruje!

python
# POZOR NA ANCHOR! Ak chceš aby sa text roztiahol doprava, použi anchor="w" (West)
canvas.create_text(100, 100, text="Ahoj", fill="black", font=("Arial", 20), anchor="w")
⚠️
Anchor: Ak nešpecifikuješ anchor, text sa centruje na daný bod. Použi anchor="w" aby sa roztiahol doprava od bodu.

Mazanie objektov – delete

Mazanie je ideálne buď kompletne na všetko, alebo pomocou „tagov", alebo podľa konkrétneho ID.

python
canvas.delete("all")       # Zmaže úplne všetko
canvas.delete("tvar")      # Zmaže len objekty s tags="tvar"
canvas.delete(id_objektu)  # Zmaže konkrétny objekt podľa jeho ID

3 Vstupy od používateľa

Widgety Entry, Button a Label pre zadávanie údajov.

Vytvorenie a umiestnenie

🚨
NAJDÔLEŽITEJŠIE PRAVIDLO: Vždy ukladaj Entry a Button do premennej a .pack() na ďalší riadok! Keby si to dal na jeden riadok (tk.Entry().pack()), uloží sa ti hodnota None a vyskočí chyba na .get().
python
# Nadpis (Label nepotrebuje premennú, ak z neho nečítaš)
tk.Label(root, text="Zadaj niečo:").pack()

# Textové políčko
vstup = tk.Entry(root)
vstup.pack()

# Tlačidlo (priradí funkciu bez zátvoriek!)
tlacidlo = tk.Button(root, text="Potvrdiť", command=vykreslenie)
tlacidlo.pack()

Čítanie z Entry políčka

Políčko vráti hodnotu vždy ako reťazec (String). Ak s tým ideš počítať, musíš to zabaliť do int().

python
def vykreslenie():
    cislo_z_vstupu = int(vstup.get())
    print("Používateľ odpovedal", cislo_z_vstupu)

4 Trackovanie klikov – Event Handler

Reagovanie na hardvérové akcie (klik myšou, stlačenie klávesy).

Myš – sledovanie kliku <Button-1>

python
def klik(event):
    # event.x a event.y obsahujú PRESNÝ pixel kam si klikol
    stlpec = (event.x - 20) // 40  # Výpočet stĺpca podľa pixelu
    print(f"Klik na X: {event.x}, Y: {event.y}")

canvas.bind("<Button-1>", klik)  # Myš viažeme na CANVAS!

Klávesnica – event.char vs event.keysym

Sú dva spôsoby. event.char dáva písmeno ako string – funguje pre čísla a bežné klávesy. Pre WASD hry a špeciálne klávesy (medzera, šípky) musíš použiť event.keysym.

python
# event.char – pre jednoduché prípady (hlasovanie číslicami atď.)
def stlacenie(event):
    if event.char == "1":
        print("Stlačil si 1")

# event.keysym – pre hry (WASD, šípky, medzera, Enter)
def zmena_smeru(event):
    klaves = event.keysym.lower()  # "w", "a", "s", "d", "space", "Return"
    if klaves == "w":
        print("Hore")
    elif klaves == "space":
        print("Medzera")

root.bind("<Key>", zmena_smeru)  # Klávesnicu viažeme na ROOT!
ℹ️
Pravidlo bindovania: Myš (<Button-1>) viažeš na canvas. Klávesnicu (<Key>) viažeš na root.

5 Rovnomerné vykresľovanie do rastra

Logika rastra pre rovnomerné rozloženie objektov v cykle.

1D raster – jeden riadok objektov

python
ZACIATOK_X = 20
VELKOST_STVORCA = 40
MEDZERA = 10
KROK = VELKOST_STVORCA + MEDZERA  # Teda 50!

for i in range(5):
    x = ZACIATOK_X + i * KROK
    canvas.create_rectangle(x, 100, x + VELKOST_STVORCA, 100 + VELKOST_STVORCA)

2D raster – riadky a stĺpce

Vnorený cyklus pre tabuľkové rozloženie (napr. mriežka, šachovnica).

python
ZACIATOK_X = 20
ZACIATOK_Y = 20
KROK = 50          # veľkosť + medzera
POCET_RIADKOV = 4
POCET_STLPCOV = 6

for rad in range(POCET_RIADKOV):
    for stlpec in range(POCET_STLPCOV):
        x = ZACIATOK_X + stlpec * KROK
        y = ZACIATOK_Y + rad * KROK
        canvas.create_rectangle(x, y, x + 40, y + 40, outline="black")

6 Animácie a pohyb

Základ každej hry alebo pohyblivej grafiky. root.after() spúšťa funkciu po určitom čase – to vytvára herný cyklus.

Herný cyklus – root.after()

Funkcia zavolá samu seba po RYCHLOST milisekundách = animačná slučka. Nikdy tu nepoužívaj time.sleep()!

python
RYCHLOST = 50  # ms medzi snímkami (50ms ≈ 20 FPS)

def logika():
    # ... pohyb, kontrola kolízií, prekreslenie ...

    root.after(RYCHLOST, logika)  # naplánuj ďalší krok

logika()  # Spusti prvý krát PRED mainloop!
root.mainloop()
⚠️
Funkciu píš bez zátvoriek – odovzdávaš referenciu, nie výsledok volania.
root.after(50, logika) ✅    root.after(50, logika())

Pohyb objektu – canvas.move()

Posunie existujúci objekt o zadaný počet pixelov. Oveľa efektívnejšie ako delete + create.

python
id_objektu = canvas.create_oval(0, 0, 40, 40, fill="blue")

def pohyb():
    canvas.move(id_objektu, 5, 0)  # 5px doprava, 0px vertikálne
    root.after(50, pohyb)

# canvas.move(id, dx, dy)
# dx > 0 = doprava,   dx < 0 = doľava
# dy > 0 = nadol,     dy < 0 = nahor

7 Práca s existujúcimi objektmi

Keď objekt už existuje na plátne, vieš zistiť jeho polohu, zmeniť vlastnosti, alebo detekovať kolízie.

Stred tvaru – canvas.bbox()

Zlatý vzorec: nakresli tvar → zisti jeho bbox → vypočítaj stred → vlož text. Používa sa všade, kde treba centrovať text do políčka alebo kruhu.

python
id_tvaru = canvas.create_oval(50, 50, 150, 150, fill="blue")

# Zisti hranice objektu
x1, y1, x2, y2 = canvas.bbox(id_tvaru)  # funguje aj canvas.coords(id_tvaru)

# Vypočítaj stred
stred_x = (x1 + x2) / 2
stred_y = (y1 + y2) / 2

# Vlož text presne do stredu
canvas.create_text(stred_x, stred_y, text="A", font=("Arial", 20, "bold"))

Klik na konkrétny objekt – find_overlapping()

Vráti zoznam ID objektov na daných súradniciach. Používa sa, keď chceš zistiť, na ktorý konkrétny tvar na plátne si klikol.

python
id_objektu = canvas.create_oval(50, 50, 150, 150, fill="blue")
objekty = {id_objektu: "A"}  # slovník: id → hodnota

def klik(event):
    nalez = canvas.find_overlapping(event.x, event.y, event.x, event.y)
    for objekt_id in nalez:
        if objekt_id in objekty:
            print(f"Klikol si na: {objekty[objekt_id]}")

canvas.bind("<Button-1>", klik)

Detekcia kolízie – find_overlapping() + bbox()

Zisti bbox pohybujúceho sa hrdinu, potom nájdi čo s ním koliduje.

python
def logika():
    hitbox = canvas.bbox(id_hrdinu)              # (x1, y1, x2, y2)
    kolizie = canvas.find_overlapping(*hitbox)  # * rozbalí tuple na 4 argumenty
    for objekt_id in kolizie:
        if objekt_id != id_hrdinu:  # ignoruj seba samého
            canvas.delete(objekt_id)
    root.after(50, logika)

Zmena vlastností – itemconfig() a itemcget()

Zmeň text, farbu alebo inú vlastnosť existujúceho objektu bez mazania a prekreslenia. Ideálne pre pohybujúce sa texty.

python
id_textu = canvas.create_text(200, 100, text="Pôvodný", fill="white")

# Zmena vlastností existujúceho objektu
canvas.itemconfig(id_textu, text="Nový text", fill="red")

# Prečítanie aktuálnej hodnoty vlastnosti
aktualny_text = canvas.itemcget(id_textu, "text")
print(aktualny_text)  # "Nový text"

8 Práca so súbormi

Súbory môžeš otvárať na čítanie, zápis alebo pridávanie. Režim určuješ druhým parametrom v open(). Každý riadok obsahuje \n na konci – vždy použi .strip().

Textový súbor – riadok po riadku

python
VSTUP = "data.txt"

with open(VSTUP, "r", encoding="utf-8") as fr:
    riadky = fr.readlines()  # list riadkov, každý má \n na konci

for riadok in riadky:
    cisty = riadok.strip()  # odstráni \n aj okolité medzery
    print(cisty)

# Prvý riadok zvlášť (napr. hlavička / max kapacita)
hlavicka = riadky[0].strip()
zvysok   = riadky[1:]  # všetky okrem prvého

CSV zo súboru (Excel export)

CSV exportované z Excelu majú encoding="windows-1250" a stĺpce oddelené ;.

python
with open("subor.csv", "r", encoding="windows-1250") as fr:
    riadky = fr.readlines()

# Rozdeliť každý riadok podľa stredníka → list stĺpcov
spracovane = [riadok.strip().split(";") for riadok in riadky]

for zaznam in spracovane:
    priezvisko = zaznam[0]
    meno       = zaznam[1]
⚠️
Encoding: Vlastnoručne vytvorené .txtutf-8. CSV export z Excelu → windows-1250.

Všetky režimy otvárania – "r", "w", "a"

Druhý parameter v open() určuje, čo sa s daným súborom stane. Toto je kľúčový rozdiel!

python
# "r" = READ (čítanie) – DEFAULT režim
# Súbor MUSÍ existovať, inak vyhodí FileNotFoundError
# Nič do neho nezapíšeš, len čítaš
with open("data.txt", "r", encoding="utf-8") as fr:
    riadky = fr.readlines()

# "w" = WRITE (zápis) – POZOR: ZMAŽE celý obsah súboru!
# Ak súbor neexistuje, vytvorí ho
# Ak existuje, VYMAŽE všetko a začne odznova
with open("data.txt", "w", encoding="utf-8") as fw:
    fw.write("Tento riadok prepíše všetko\n")

# "a" = APPEND (pridávanie) – NEPREPÍŠE nič!
# Ak súbor neexistuje, vytvorí ho
# Ak existuje, PRIDÁ text na koniec (pod posledný riadok)
with open("data.txt", "a", encoding="utf-8") as fw:
    fw.write("Toto sa pridá pod existujúce riadky\n")
🚨
NAJVÄČŠÍ ROZDIEL: "w" = vymaže súbor a zapíše odznova. "a" = ponechá starý obsah a pridá nové riadky na koniec. Ak chceš zbierať hlasy, objednávky alebo výsledky, vždy použi "a"!

Zápis do súboru – write() vs writelines()

write() zapíše jeden reťazec. Automaticky nepridáva nový riadok – musíš sám dať \n!

python
# write() – zapíše PRESNE to, čo mu dáš
with open("vystup.txt", "w", encoding="utf-8") as fw:
    fw.write("Prvý riadok\n")
    fw.write("Druhý riadok\n")
    fw.write(f"ID: {id_polozky} Názov: {nazov}\n")

# writelines() – zapíše list reťazcov naraz
zoznam = ["riadok 1\n", "riadok 2\n", "riadok 3\n"]
with open("vystup.txt", "w", encoding="utf-8") as fw:
    fw.writelines(zoznam)
⚠️
\n je povinný! fw.write("text") nedá nový riadok. Musíš písať fw.write("text\n"), inak sa ti všetko nalepí do jedného riadku.

Praktický vzor – vyprázdni a potom zbieraj

Typický postup v úlohách: na začiatku programu súbor vyprázdniš cez "w", potom počas behu pridávaš cez "a".

python
SUBOR = "vysledky.txt"

# Na začiatku programu: "w" + pass = vytvorí/vyprázdni súbor
with open(SUBOR, "w", encoding="utf-8") as fw:
    pass

# Počas behu: "a" pridáva riadky pod seba
def zapisat(text):
    with open(SUBOR, "a", encoding="utf-8") as fw:
        fw.write(f"{text}\n")
💡
Napríklad pri ukladaní výsledkov: najprv open(SUBOR, "w") + pass na vyčistenie, potom open(SUBOR, "a") v podprograme na postupný zápis prvkov.

1 Kostra programu a vstup od používateľa

Konzolové úlohy zvyčajne riešia: (1) načítaj vstup, (2) spracuj dáta, (3) vypíš alebo zapíš výsledok. Celý kód uzatvor do funkcie – aby si ho mohol volať s rôznymi súbormi.

Vstup z klávesnice – input()

input() vždy vráti reťazec (string). Ak chceš číslo, musíš to obaliť do int() alebo float().

python
# Jeden reťazec
meno = input("Zadaj meno: ")

# Číslo – treba obaliť int() alebo float()
vek = int(input("Zadaj vek: "))

# Viac hodnôt naraz oddelených medzerou → split()
tipy = input("Zadaj 6 čísel: ").split()  # list reťazcov

# Hneď premeniť na čísla
cisla = [int(x) for x in input("Čísla: ").split()]

Hlavná funkcia + spustenie

Funkcia drží logiku, parameter umožní volať s rôznymi súbormi. Blok if __name__ == "__main__" je voliteľný štandard, ale stačí aj jednoduché volanie pod definíciou.

python
def spracuj(vstup: str):
    with open(vstup, "r", encoding="utf-8") as fr:
        riadky = fr.readlines()
    # ... logika ...
    print("Výsledok")

vstup = "data.txt"
spracuj(vstup)
💡
Cestu k súboru drž v premennej nad volaním funkcie. Funkcia by mala fungovať s ľubovoľnou cestou.

2 Práca so súbormi

Najčastejšia operácia v konzolových úlohách. Súbor vždy otváraj cez with open(...) as ... – sám sa zavrie po skončení bloku.

Čítanie celého súboru – readlines()

readlines() vráti list reťazcov. Každý riadok obsahuje \n na konci – preto vždy .strip().

python
with open("data.txt", "r", encoding="utf-8") as fr:
    riadky = fr.readlines()

for riadok in riadky:
    cisty = riadok.strip()  # odstráni \n + okolité medzery
    print(cisty)

# Prvý riadok zvlášť (napr. hlavička, kapacita)
prvy   = riadky[0].strip()
zvysok = riadky[1:]  # všetky okrem prvého

Režimy otvárania – "r", "w", "a"

python
# "r" = READ – súbor musí existovať
with open("data.txt", "r", encoding="utf-8") as fr:
    riadky = fr.readlines()

# "w" = WRITE – ZMAŽE celý obsah a vytvorí nový!
with open("vystup.txt", "w", encoding="utf-8") as fw:
    fw.write("Prepíše všetko\n")

# "a" = APPEND – pridá na koniec, NEPREPÍŠE
with open("vystup.txt", "a", encoding="utf-8") as fw:
    fw.write("Pridá pod existujúce\n")
⚠️
Encoding: Bežné .txtutf-8. CSV export z Excelu → windows-1250, oddeľovač ;.

Zápis – write() a writelines()

write() zapíše jeden reťazec – musíš sám pridať \n. writelines() zapíše celý list naraz (tiež bez automatického \n).

python
with open("vystup.txt", "w", encoding="utf-8") as fw:
    fw.write(f"{meno} {priezvisko}\n")
    fw.write(f"{cislo:5d}\n")        # zarovnanie na 5 znakov
    fw.write(f"{meno:<20}{vek}\n")  # stĺpec šírka 20

CSV (oddeľovač + viaceré stĺpce)

python
with open("data.csv", "r", encoding="windows-1250") as fr:
    riadky = fr.readlines()

# List comprehension: každý riadok rozdeliť podľa ;
tabulka = [r.strip().split(";") for r in riadky]

for zaznam in tabulka:
    stlpec1 = zaznam[0]
    stlpec2 = zaznam[1]

3 Spracovanie reťazcov

Reťazce sú základ – textové dáta zo súborov a vstupu. Tieto metódy potrebuješ pri každej úlohe.

Rozdelenie a spojenie – split() / join()

python
# split() bez argumentu = rozdelí podľa BIELYCH znakov (medzery, taby, \n)
slova = "ahoj svet python".split()       # ["ahoj", "svet", "python"]

# split(",") = rozdelí podľa konkrétneho znaku
casti = "Janko;Mrkvička;15".split(";")    # ["Janko", "Mrkvička", "15"]

# split(" ", 2) = rozdelí maximálne 2-krát (= 3 časti)
prve_dve = "a b c d e".split(" ", 2)     # ["a", "b", "c d e"]

# join() = opak split – spojí list reťazcov
veta   = " ".join(["ahoj", "svet"])      # "ahoj svet"
csv    = ";".join(["a", "b", "c"])         # "a;b;c"
bezmedz = "".join(["a", "b", "c"])         # "abc"
⚠️
join() funguje LEN s listom reťazcov! Ak máš čísla, premeň: ", ".join(map(str, cisla)) alebo ", ".join(str(c) for c in cisla).

Čistenie a zmena – strip, replace, upper, lower

python
"  ahoj  \n".strip()           # "ahoj" – orezáva oba okraje
"ahoj".upper()                 # "AHOJ"
"AHOJ".lower()                 # "ahoj"
"12,5".replace(",", ".")       # "12.5"  – nahradí všetky výskyty
"+12".replace("+", "")          # "12"   – odstránenie znaku
"abcabc".count("a")             # 2      – počet výskytov
"ABC".find("B")                  # 1      – index prvého výskytu (-1 ak nie je)

Rezanie reťazca – [a:b] a [::-1]

python
s = "Python"

s[0]        # "P"     – prvý znak
s[-1]       # "n"     – posledný znak
s[0:3]      # "Pyt"   – od 0 (vrátane) po 3 (BEZ)
s[1:-1]     # "ytho"  – bez prvého a posledného
s[:3]       # "Pyt"   – od začiatku
s[3:]       # "hon"   – po koniec
s[::-1]     # "nohtyP" – OBRÁTENIE reťazca!

Testovacie metódy – isalpha, isdigit

python
"abc".isalpha()    # True  – obsahuje LEN písmená
"abc1".isalpha()   # False – obsahuje aj číslo
"123".isdigit()    # True  – obsahuje LEN číslice
"abc".isupper()    # False – nie je veľkými písmenami
"ABC".isupper()    # True

ASCII konverzia – chr() a ord()

Pre úlohy na šifrovanie/posunutie znakov v abecede.

python
ord("a")     # 97  – ASCII kód znaku
ord("A")     # 65
chr(97)      # "a" – znak z ASCII kódu

# Posunutie písmena o 3 v abecede
posun = chr(ord("a") + 3)   # "d"

4 Listy (zoznamy)

List drží postupnosť hodnôt – v poradí, prístup cez index. Najčastejšia dátová štruktúra.

Základné operácie

python
zoznam = []
zoznam.append("a")         # pridá na koniec
zoznam.extend(["b", "c"])    # pridá viacero naraz
zoznam.remove("a")         # odstráni prvý výskyt
zoznam.pop()                # odstráni a vráti posledný
zoznam.pop(0)               # odstráni a vráti prvý

len(zoznam)                # dĺžka
"a" in zoznam              # True/False – či obsahuje
zoznam[0]                  # prvý prvok
zoznam[-1]                 # posledný prvok
zoznam[1:3]                # pod-list (rovnaký princíp ako string slicing)

Triedenie – sort() vs sorted()

sort() mení samotný list. sorted() vráti novú zoradenú kópiu.

python
cisla = [3, 1, 2]
cisla.sort()                       # mení list: [1, 2, 3]
cisla.sort(reverse=True)           # zostupne: [3, 2, 1]

nove = sorted(cisla)               # vráti novú kópiu, pôvodný nemení

# Triedenie listu slovníkov podľa kľúča
ludia = [{"meno": "B", "vek": 20}, {"meno": "A", "vek": 30}]
podla_veku = sorted(ludia, key=lambda p: p["vek"])

List comprehension – kompaktný cyklus

Stručný zápis pre vytvorenie listu pomocou cyklu. Forma: [výraz for prvok in zdroj if podmienka].

python
# Druhé mocniny 0–4
stvorce = [x ** 2 for x in range(5)]      # [0, 1, 4, 9, 16]

# Konverzia listu reťazcov na čísla
cisla = [int(x) for x in ["1", "2", "3"]]   # [1, 2, 3]

# Strip + split každého riadku zo súboru
tabulka = [r.strip().split(";") for r in riadky]

# S podmienkou – len párne
parne = [x for x in range(10) if x % 2 == 0]

5 Slovníky (dict) a zoznam záznamov

Slovník je kľúč → hodnota. List slovníkov je najčastejší spôsob ako udržať tabuľkové dáta (každý riadok = záznam).

Základné operácie so slovníkom

python
osoba = {"meno": "Janko", "vek": 20}

osoba["meno"]                  # "Janko"
osoba["vek"] = 21                # úprava hodnoty
osoba["email"] = "a@b.sk"        # pridanie nového kľúča

"meno" in osoba                # True – či kľúč existuje
osoba.get("email", "–")         # bezpečné získanie s defaultom

for kluc, hodnota in osoba.items():
    print(kluc, ":", hodnota)

Vytvorenie záznamov zo súboru (list dictov)

Toto je najčastejší vzor v maturitných úlohách. Každý riadok = jeden záznam = jeden slovník v liste.

python
with open("data.txt", "r", encoding="utf-8") as fr:
    riadky = fr.readlines()

zaznamy = []
for riadok in riadky:
    meno, priezvisko, vek = riadok.strip().split()  # rozbalenie
    zaznamy.append({
        "meno":       meno,
        "priezvisko": priezvisko,
        "vek":        int(vek)
    })

# Prístup k poliam záznamu
for z in zaznamy:
    print(f"{z['meno']} má {z['vek']} rokov")
💡
Číslo vždy obaľ do int() už pri vytváraní záznamu – inak ti zostane reťazec a neporovnáš ho ako číslo.

Dict comprehension a počítanie kategórií

Klasická úloha: spočítaj, koľkokrát sa každá hodnota vyskytuje.

python
# Dict comprehension – inicializácia na 0
pocty = {znak: 0 for znak in "ABCDEFGHIJKLMNOPQRSTUVWXYZ"}

# Vzor: ak kľúč nie je v dicte, založ ho na 1, inak zvýš
pocty_krajin = {}
for z in zaznamy:
    krajina = z["krajina"]
    if krajina not in pocty_krajin:
        pocty_krajin[krajina] = 1
    else:
        pocty_krajin[krajina] += 1

# Výpis výsledkov
for krajina, pocet in pocty_krajin.items():
    print(f"{krajina}: {pocet}")

6 Min, Max, počítanie a priemer

Vstavané funkcie min, max, sum, len ti ušetria desiatky riadkov cyklov.

Min/Max/Sum nad listom čísel

python
cisla = [10, 5, 8, 3, 12]

max(cisla)               # 12
min(cisla)               # 3
sum(cisla)               # 38
len(cisla)               # 5

# Priemer
priemer = sum(cisla) / len(cisla)   # 7.6

# Maximum z viacerých argumentov (nie listu)
max(3, 7, 2)               # 7

Max so záznamami – key=lambda

Ak máš list slovníkov, povedz Pythonu podľa čoho hľadať max. lambda je „rýchla funkcia" v jednom riadku.

python
ludia = [
    {"meno": "Anna", "vek": 25},
    {"meno": "Boris", "vek": 30}
]

# Záznam s najvyšším vekom
najstarsi = max(ludia, key=lambda p: p["vek"])
print(najstarsi["meno"])           # "Boris"

# Najdlhšie meno
najdlhsi = max(ludia, key=lambda p: len(p["meno"]))
ℹ️
Lambda funkcie: lambda p: p["vek"] je to isté ako mať funkciu def fn(p): return p["vek"]. Iba kratšie a inline.

Hľadanie cyklom (ak nestačí max)

Niekedy treba sledovať viacero premenných naraz, alebo nájsť VŠETKY záznamy s maximom.

python
# Inicializuj na veľmi vysoké/nízke číslo
min_cas = float("inf")        # nekonečno
vitaz = None

for pretekar in ludia:
    if pretekar["cas"] < min_cas:
        min_cas = pretekar["cas"]
        vitaz = pretekar

# Všetci s rovnakým maximom (pre prípad rovnosti)
max_vykon = max(z["vykon"] for z in zaznamy)
vitazi = [z for z in zaznamy if z["vykon"] == max_vykon]

Formátovanie čísel a času

python
# Sekundy → min a sek
cas_s = 185
print(f"{cas_s // 60}min {cas_s % 60}sek")   # 3min 5sek

# Zaokrúhlenie
round(3.14159, 2)                  # 3.14

# f-string formátovanie čísel
print(f"{3.14159:.2f}")              # "3.14" – 2 desatinné
print(f"{42:05d}")                 # "00042" – doplnené nulami
print(f"{'ahoj':<10}|")             # "ahoj      |" – zarovnanie vľavo (10 znakov)
print(f"{'ahoj':>10}|")             # "      ahoj|" – zarovnanie vpravo

7 Cykly a iterácia

Cyklus prechádza prvkami listu. range, enumerate a zip sú nástroje, ktoré ti veľmi pomôžu.

range() – generovanie čísel

python
range(5)         # 0, 1, 2, 3, 4
range(1, 6)      # 1, 2, 3, 4, 5
range(0, 10, 2)   # 0, 2, 4, 6, 8
range(10, 0, -1)  # 10, 9, ..., 1 (od konca)

# Indexovaný prístup k listu
for i in range(len(zoznam)):
    print(i, zoznam[i])

enumerate() – index + hodnota naraz

Lepšie ako range(len(...)). Vráti dvojicu (index, prvok).

python
mena = ["Anna", "Boris", "Cyril"]

for i, meno in enumerate(mena):
    print(f"{i}. {meno}")
# 0. Anna
# 1. Boris
# 2. Cyril

# Štart od 1 (číslovanie pre používateľa)
for i, meno in enumerate(mena, start=1):
    print(i, meno)

zip() – prechádzanie dvoch listov naraz

python
mena  = ["Anna", "Boris"]
veky  = [25, 30]

for meno, vek in zip(mena, veky):
    print(f"{meno}: {vek}")

break a continue

python
for x in range(10):
    if x == 5:
        break          # úplne ukončí cyklus
    if x % 2 == 0:
        continue       # preskočí na ďalšiu iteráciu
    print(x)

while cyklus

python
i = 0
while i < 5:
    print(i)
    i += 1          # nezabudni zvyšovať, inak nekonečný cyklus!

# Vstup, kým nepríde správna hodnota
odpoved = ""
while odpoved != "koniec":
    odpoved = input("Napíš: ")

8 Náhodné čísla a množiny (set)

Modul random pre náhodné dáta a set pre rýchle porovnávanie množín hodnôt.

Modul random – základné funkcie

python
import random as rd

rd.randint(1, 10)             # celé číslo 1–10 vrátane
rd.random()                  # desatinné 0.0–1.0
rd.choice(["a", "b", "c"])      # jeden náhodný prvok
rd.choice([True, False])         # náhodne true/false

# sample = N RÔZNYCH (bez opakovania) prvkov
rd.sample(range(1, 50), 6)      # [3, 17, 42, 8, 25, 31]
rd.sample(["a", "b", "c", "d"], 2)   # 2 rôzne prvky

# shuffle = zamieša list NA MIESTE (mení pôvodný!)
zoznam = [1, 2, 3, 4]
rd.shuffle(zoznam)              # napr. [3, 1, 4, 2]
⚠️
shuffle() NEVRACIA nič – mení samotný list. Nepíš x = rd.shuffle(zoznam), dostaneš None!

Set – množina unikátnych prvkov

Set drží iba jedinečné hodnoty. Má rýchle množinové operácie: prienik, zjednotenie, rozdiel.

python
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

a.intersection(b)        # {3, 4} – prienik (čo majú spoločné)
a.union(b)               # {1, 2, 3, 4, 5, 6} – zjednotenie
a.difference(b)          # {1, 2} – čo má a, ale b nie

# Odstránenie duplikátov zo zoznamu
unikatne = list(set([1, 2, 2, 3, 3, 3]))   # [1, 2, 3]

# Vytvorenie setu z listu reťazcov
tipy = set(["3", "7", "21"])
vyhry = {"3", "21", "49"}
uhadnute = tipy.intersection(vyhry)   # {"3", "21"}
print(len(uhadnute))                  # 2
💡
Set comprehension funguje rovnako ako list: {x*2 for x in range(5)}.