List

5th Aug 2026

Exercism

  • List OPS
  • Accumulate

Tutoriál Pythonu: Práca so zoznamami

Čo sa v tutoriáli naučíte

Po skončení tohto tutoriálu budete vedieť:

  • vytvárať zoznamy v Pythone
  • pridávať nové prvky pomocou append()
  • kombinovať viacero zoznamov
  • určovať dĺžku zoznamu
  • vyberať časti zoznamu pomocou rezania (list slicing)
  • iterovať zoznamom
  • obrátiť zoznam
  • vyhľadávať prvky v zozname
  • filtrovať a transformovať zoznamy pomocou filter() a map()
  • aplikovať funkciu na celý zoznam pomocou reduce()
  • písať stručné a čitateľné zoznamy s porozumením

Začíname: dobrodružstvo v Košickom lese

Predstavte si, že vytvárate jednoduchú dobrodružnú hru. Hlavný hrdina Janko putuje čarovným košickým lesom a zbiera poklady. Namiesto toho, aby každý nájdený predmet ukladal do samostatnej premennej, nosí všetko v jednom čarovnom batohu. V Pythone tento batoh predstavuje zoznam.

Každá situácia v príbehu predstaví inú operáciu so zoznamom — od pridávania predmetov až po ich filtrovanie a transformáciu.

Janko začína svoje dobrodružstvo s prázdnym batohom.

backpack = []

print(backpack)

Výstup

[]

Po chvíli nájde meč, jablko a starú mapu. Všetky predmety uloží do jedného zoznamu.

backpack = ["Meč", "Jablko", "Mapa"]

print(backpack)

Výstup

['Meč', 'Jablko', 'Mapa']

V jednom zozname pritom môžu byť uložené aj rôzne typy údajov. Predmet môžeme napríklad doplniť o počet mincí, informáciu o splnenej úlohe či jeho hmotnosť.

mixed = ["Meč", 100, True, 5.7]

print(mixed)

Výstup

['Meč', 100, True, 5.7]

Pridanie predmetu pomocou append()

Jankov batoh už nie je prázdny, no počas cesty doň pribúdajú ďalšie nálezy. Keď nájde štít, pridá ho na koniec existujúceho zoznamu pomocou metódy append().

backpack.append("Štít")

print(backpack)

Výstup

['Meč', 'Jablko', 'Mapa', 'Štít']

Rovnakým spôsobom si o niečo neskôr odloží aj liečivý elixír.

backpack.append("Elixír")

print(backpack)

Výstup

['Meč', 'Jablko', 'Mapa', 'Štít', 'Elixír']

Metóda append() vždy pridá jeden nový prvok na koniec zoznamu. Janko však čoskoro potrebuje do batohu pridať viac predmetov naraz.


Spojenie zoznamov pomocou + a extend()

Na ďalšej ceste Janko stretne svoju kamarátku Marienku, ktorá nesie vlastnú výbavu.

marienka = ["Luk", "Šíp"]

Najprv si vytvoria nový spoločný zoznam pomocou operátora +. Ich pôvodné batohy pritom zostanú nezmenené.

combined = backpack + marienka

print(combined)

Výstup

['Meč', 'Jablko', 'Mapa', 'Štít', 'Elixír', 'Luk', 'Šíp']

Ak chce Janko namiesto toho vložiť Marienkinu výbavu priamo do svojho batoha, použije metódu extend().

backpack.extend(marienka)

print(backpack)

Výstup

['Meč', 'Jablko', 'Mapa', 'Štít', 'Elixír', 'Luk', 'Šíp']

Na rozdiel od operátora + metóda extend() upravuje pôvodný zoznam. Po spojení výbavy preto Janka zaujíma, koľko predmetov teraz nesie.


Počet prvkov pomocou len()

Batoh je čoraz ťažší. Počet jeho prvkov Janko zistí pomocou funkcie len().

print(len(backpack))

Výstup

7

Samotný počet mu však nepovie, ktoré predmety má pri sebe. Preto si ich postupne prezrie.


Výber časti zoznamu pomocou rezania (list slicing)

Janko niekedy nepotrebuje celý obsah batoha, ale iba niekoľko predmetov. Časť zoznamu môže vybrať pomocou rezania (slicing).

Základný zápis má tvar:

zoznam[od:po:krok]

Hodnota od určuje index prvého vybraného prvku. Hodnota po označuje hranicu, ktorá sa už do výrezu nezahrnie.

backpack = ["Meč", "Jablko", "Mapa", "Štít", "Elixír", "Luk", "Šíp"]

print(backpack[1:4])

Výstup

['Jablko', 'Mapa', 'Štít']

Výrez začína prvkom s indexom 1 a končí tesne pred indexom 4. Ak niektorú hranicu vynecháme, Python použije začiatok alebo koniec zoznamu.

print(backpack[:3])
print(backpack[4:])

Výstup

['Meč', 'Jablko', 'Mapa']
['Elixír', 'Luk', 'Šíp']

Tretia hodnota určuje krok. Napríklad krokom 2 vyberieme každý druhý predmet.

print(backpack[::2])

Výstup

['Meč', 'Mapa', 'Elixír', 'Šíp']

Použiť možno aj záporné indexy, ktoré počítajú prvky od konca. Index -1 označuje posledný prvok.

print(backpack[-3:])

Výstup

['Elixír', 'Luk', 'Šíp']

Rezanie vytvára nový zoznam a pôvodný zoznam nemení. Zápis backpack[:] preto vytvorí plytkú kópiu celého zoznamu. Záporný krok, napríklad backpack[::-1], vytvorí zoznam v opačnom poradí; túto možnosť využijeme neskôr pri obracaní batoha.


Prechádzanie zoznamom pomocou for a enumerate()

Na prechod všetkými predmetmi použije cyklus for. V každom opakovaní sa do premennej item uloží jeden prvok zoznamu.

for item in backpack:
    print(item)

Výstup

Meč
Jablko
Mapa
Štít
Elixír
Luk
Šíp

Ak chce pri každom predmete poznať aj jeho pozíciu, spojí cyklus s funkciou enumerate().

for index, item in enumerate(backpack):
    print(index, item)

Výstup

0 Meč
1 Jablko
2 Mapa
3 Štít
4 Elixír
5 Luk
6 Šíp

Poradie predmetov nemusí Jankovi vždy vyhovovať. Niekedy sa potrebuje dostať najskôr k tým, ktoré vložil do batoha ako posledné.


Obrátenie poradia pomocou reverse() a rezania

Najnovšie nájdené predmety sú navrchu batoha, preto Janko obráti poradie celého zoznamu metódou reverse().

backpack.reverse()

print(backpack)

Výstup

['Šíp', 'Luk', 'Elixír', 'Štít', 'Mapa', 'Jablko', 'Meč']

Metóda reverse() mení pôvodný zoznam. Ak Janko potrebuje iba vytvoriť jeho obrátenú kópiu, môže použiť rezanie s krokom -1.

print(backpack[::-1])

Rezanie vytvorí nový zoznam, takže aktuálne poradie v batohu nezmení. Ak však Janko nepotrebuje nový zoznam a chce predmety iba postupne prečítať odzadu, vhodnejšia je funkcia reversed().

Pred ďalšou ukážkou Janko vráti predmety do pôvodného poradia.

backpack.reverse()

Prechádzanie odzadu bez zmeny zoznamu: reversed()

Janko si chce prezrieť obsah batoha od najnovšieho predmetu po najstarší, no tentoraz nechce meniť ich uloženie.

Na to slúži funkcia reversed(), ktorá vytvorí iterátor prechádzajúci prvky odzadu.

for item in reversed(backpack):
    print(item)

Výstup

Šíp
Luk
Elixír
Štít
Mapa
Jablko
Meč

Po skončení cyklu zostáva pôvodný zoznam nezmenený.

print(backpack)

Výstup

['Meč', 'Jablko', 'Mapa', 'Štít', 'Elixír', 'Luk', 'Šíp']

To je hlavný rozdiel oproti metóde reverse(), ktorá poradie prvkov v zozname zmení priamo. Opačné poradie však nie je jediný spôsob, ako sa dá na obsah batoha pozerať.


Prechádzanie v abecednom poradí: sorted()

Pri kontrole výbavy chce Janko niekedy zobraziť predmety podľa abecedy bez toho, aby zmenil ich skutočné poradie v batohu.

Na to slúži funkcia sorted().

for item in sorted(backpack):
    print(item)

Výstup

Elixír
Jablko
Luk
Mapa
Meč
Šíp
Štít

Aj tentoraz zostáva pôvodný zoznam nezmenený.

print(backpack)

Výstup

['Meč', 'Jablko', 'Mapa', 'Štít', 'Elixír', 'Luk', 'Šíp']

Funkcia sorted() vracia nový usporiadaný zoznam, zatiaľ čo pôvodný zoznam ponechá bez zmien. Smer triedenia možno navyše jednoducho otočiť.

Zoradenie od konca abecedy: reverse=True

Ak chce Janko začať od konca abecedy, funkcii sorted() odovzdá parameter reverse=True.

for item in sorted(backpack, reverse=True):
    print(item)

Výstup

Štít
Šíp
Meč
Mapa
Luk
Jablko
Elixír

Krátke anonymné funkcie pomocou lambda

Doteraz o spracovaní predmetov rozhodovali najmä vstavané funkcie a ich parametre. Pri filtrovaní alebo úprave výbavy však Janko potrebuje zadať vlastné pravidlo. Ak je takéto pravidlo krátke a použije sa iba raz, môže ho zapísať ako anonymnú funkciu, nazývanú aj lambda funkcia.

Predstavte si, že čarodejník potrebuje očarovať jeden meč. Nemá zmysel vytvárať pomenovanú funkciu, ak ju použije iba raz.

Bežná funkcia vyzerá takto:

def enchant(item):
    return "Magický " + item

print(enchant("Meč"))

Výstup

Magický Meč

To isté môžeme zapísať kratšie pomocou lambda.

enchant = lambda item: "Magický " + item

print(enchant("Meč"))

Výstup

Magický Meč

Lambda funkcia má jednoduchú syntax:

lambda parametre: výraz

Na rozdiel od bežnej funkcie:

  • nemá meno (preto sa nazýva anonymná),
  • neobsahuje príkaz return – výsledok výrazu vráti automaticky,
  • môže obsahovať iba jeden výraz, nie viacero príkazov.

Napríklad funkcia, ktorá zdvojnásobí číslo:

double = lambda x: x * 2

print(double(5))

Výstup

10

Lambda funkcie sa najčastejšie používajú spolu s funkciami map(), filter() alebo reduce(). Umožňujú im priamo odovzdať jednoduchú operáciu bez vytvárania samostatnej pomenovanej funkcie.

Napríklad pri odstraňovaní jabĺk zo zoznamu:

items = ["Jablko", "Meč", "Jablko", "Štít"]

valuable = list(filter(
    lambda item: item != "Jablko",
    items
))

print(valuable)

Tu výraz

lambda item: item != "Jablko"

znamená:

„Pre každý prvok s názvom item vráť hodnotu True, ak to nie je Jablko, inak False.“

Funkcia filter() potom ponechá iba tie prvky, pre ktoré lambda funkcia vrátila hodnotu True.

Poznámka: Lambda funkcie sú vhodné iba pre krátke a jednoduché operácie. Ak funkcia obsahuje viac krokov alebo zložitejšiu logiku, je prehľadnejšie použiť klasickú funkciu vytvorenú pomocou def.


Výber prvkov pomocou filter()

Prvým praktickým využitím lambda funkcie bude výber užitočnej výbavy. Janko už nepotrebuje jablká, preto pomocou funkcie filter() vytvorí nový zoznam bez nich.

items = ["Jablko", "Meč", "Jablko", "Štít", "Elixír"]

valuable = list(filter(
    lambda item: item != "Jablko",
    items
))

print(valuable)

Výstup

['Meč', 'Štít', 'Elixír']

Funkcia filter() teda rozhoduje, ktoré prvky zostanú. Ak chceme namiesto výberu zmeniť každý prvok, použijeme funkciu map().


Premena prvkov pomocou map()

Miestny čarodejník teraz očaruje všetky Jankove zbrane. Rovnakú úpravu má vykonať nad každým prvkom zoznamu, preto použije funkciu map().

items = ["Meč", "Štít", "Luk"]

magic_items = list(map(
    lambda item: "Magický " + item,
    items
))

print(magic_items)

Výstup

['Magický Meč', 'Magický Štít', 'Magický Luk']

Výsledkom je opäť zoznam, tentoraz s premenenými prvkami. Niekedy však Janko nepotrebuje ďalší zoznam, ale jediný spoločný výsledok.


Výpočet jednej hodnoty pomocou reduce()

Predpokladajme, že každý nájdený poklad má určitú hodnotu a Janko chce poznať hodnotu celej zbierky.

values = [150, 40, 80, 120]

Na výpočet celkovej hodnoty použijeme funkciu reduce() z modulu functools.

from functools import reduce

total = reduce(
    lambda a, b: a + b,
    values
)

print(total)

Výstup

390

Funkcia reduce() spája hodnoty po dvojiciach, až kým nezostane jediný výsledok. Výpočet preto prebieha postupne.

150 + 40 = 190
190 + 80 = 270
270 + 120 = 390

Tvorba zoznamov pomocou list comprehension

Funkcie filter() a map() dokážu zoznam vybrať alebo premeniť. Pri jednoduchých úlohách však Python ponúka aj stručnejší zápis. Najprv sa pozrime na vytvorenie zoznamu druhých mocnín klasickým cyklom.

numbers = [1, 2, 3, 4, 5]

squares = []

for n in numbers:
    squares.append(n * n)

print(squares)

Ten istý výsledok možno zapísať kratšie a čitateľnejšie pomocou konštrukcie list comprehension.

numbers = [1, 2, 3, 4, 5]

squares = [n * n for n in numbers]

print(squares)

Výstup

[1, 4, 9, 16, 25]

List comprehension môže obsahovať aj podmienku, a tak do nového zoznamu vybrať iba niektoré prvky.

numbers = [1, 2, 3, 4, 5, 6]

even = [n for n in numbers if n % 2 == 0]

print(even)

Výstup

[2, 4, 6]

V jedinom zápise možno výber a premenu aj skombinovať.

numbers = [1, 2, 3, 4, 5, 6]

double_even = [n * 2 for n in numbers if n % 2 == 0]

print(double_even)

Výstup

[4, 8, 12]

List comprehension tak dokáže v jednom čitateľnom výraze vytvoriť nový zoznam, vybrať potrebné prvky a zároveň ich premeniť.


Ďalšie zdroje

Ak si chcete prácu so zoznamami precvičiť alebo preštudovať podrobnejšie, pokračujte v týchto materiáloch:

Previous Post Next Post

List