Topic notes

Lists

~14 min read18 runnable examples

These notes are written in Slovak. The examples run the same in any language.

You can run every example right here, then edit the code and see what changes. Your code runs only in this browser, in an isolated environment with no access to the internet or your account.

Zatiaľ sme mali v každej premennej jednu hodnotu. Čo ak potrebujeme uložiť známky celej triedy, výsledky sto meraní alebo nákupný zoznam? Na to slúži zoznam (typ list) – usporiadaná postupnosť hodnôt uložená pod jedným menom. Zoznamy sú v Pythone asi najpoužívanejšia dátová štruktúra a bez nich sa nezaobíde takmer žiadna maturitná úloha.

Čo sa naučíš

  • vytvoriť zoznam, pristupovať k prvkom cez indexy a meniť ich,
  • používať metódy zoznamov (append, insert, pop, remove, sort, …),
  • prechádzať zoznam cyklom a používať funkcie len, sum, min, max, sorted,
  • načítať zoznam zo vstupu a vytvoriť náhodný zoznam,
  • zapisovať zoznamy stručne pomocou generátorového zápisu.

1Vytvorenie zoznamu a indexy

Zoznam zapíšeme do hranatých zátvoriek, prvky oddelíme čiarkou:

>>> znamky = [1, 3, 2, 1, 4]
>>> mena = ["Ema", "Ján", "Sofia"]
>>> prazdny = []
>>> zmiesany = [7, "text", 3.5, True]
>>> len(znamky)
5
>>> len(prazdny)
0

Prvky zoznamu sú očíslované indexmi presne ako znaky reťazca – od nuly, záporné od konca:

index01234
prvok1020304050
záporný index-5-4-3-2-1
>>> z = [10, 20, 30, 40, 50]
>>> z[0]
10
>>> z[-1]
50
>>> z[1:3]
[20, 30]
>>> z[::-1]
[50, 40, 30, 20, 10]
>>> z[5]
IndexError: list index out of range

Rezy fungujú rovnako ako pri reťazcoch a vytvárajú nový zoznam.

1.1Zoznamy sa dajú meniť

Na rozdiel od reťazcov je zoznam meniteľný: prvok môžeme prepísať priradením.

>>> z = [10, 20, 30]
>>> z[1] = 99
>>> z
[10, 99, 30]
>>> z[-1] += 5
>>> z
[10, 99, 35]

1.2Zoznam z iných hodnôt

>>> list(range(1, 6))
[1, 2, 3, 4, 5]
>>> list("ahoj")
['a', 'h', 'o', 'j']
>>> "a,b,c".split(",")
['a', 'b', 'c']
>>> [0] * 5
[0, 0, 0, 0, 0]
>>> [1, 2] + [3, 4]
[1, 2, 3, 4]
>>> 3 in [1, 2, 3]
True

[0] * 5 vytvorí zoznam piatich núl – hodí sa ako počiatočný stav napríklad pre počítadlá. + spojí dva zoznamy do nového, in zistí, či je hodnota v zozname.

2Metódy zoznamov

MetódaČo urobí
z.append(x)pridá x na koniec
z.insert(i, x)vloží x na index i (ostatné sa posunú)
z.pop()odoberie a vráti posledný prvok
z.pop(i)odoberie a vráti prvok na indexe i
z.remove(x)odstráni prvý výskyt hodnoty x (ak nie je, chyba)
z.index(x)vráti index prvého výskytu x (ak nie je, chyba)
z.count(x)koľkokrát je x v zozname
z.sort()zoradí zoznam (vzostupne; reverse=True zostupne)
z.reverse()obráti poradie prvkov
z.extend(iny)pridá na koniec všetky prvky iného zoznamu
z.copy()vráti kópiu zoznamu
z.clear()vymaže všetky prvky
Python
nakup = ["chlieb", "mlieko"]
nakup.append("vajcia")
nakup.insert(0, "jablká")
print(nakup)
odobrane = nakup.pop()
print("odobrané:", odobrane, "→", nakup)
nakup.remove("chlieb")
print(nakup)
print("index mlieka:", nakup.index("mlieko"))

Výstup:

['jablká', 'chlieb', 'mlieko', 'vajcia']
odobrané: vajcia → ['jablká', 'chlieb', 'mlieko']
['jablká', 'mlieko']
index mlieka: 1
Python
cisla = [5, 3, 8, 1, 9, 2]
cisla.sort()
print(cisla)
cisla.sort(reverse=True)
print(cisla)
cisla.reverse()
print(cisla)
print("počet trojok:", cisla.count(3))

Výstup:

[1, 2, 3, 5, 8, 9]
[9, 8, 5, 3, 2, 1]
[1, 2, 3, 5, 8, 9]
počet trojok: 1

3Prechádzanie zoznamu

Najčastejšie prechádzame priamo prvky:

Python
teploty = [12.5, 14.0, 9.5, 17.0]
for t in teploty:
print(t, "°C")

Výstup:

12.5 °C
14.0 °C
9.5 °C
17.0 °C

Ak potrebujeme aj pozíciu prvku (alebo chceme prvky meniť), prechádzame indexy:

Python
body = [45, 38, 50]
for i in range(len(body)):
body[i] = body[i] + 2 # každému pridáme 2 body
print(body)

Výstup:

[47, 40, 52]

Pohodlne získaš index aj prvok naraz funkciou enumerate:

Python
mena = ["Ema", "Ján", "Sofia"]
for poradie, meno in enumerate(mena, start=1):
print(f"{poradie}. {meno}")

Výstup:

1. Ema
2. Ján
3. Sofia

4Funkcie pre zoznamy

>>> z = [4, 9, 1, 7]
>>> len(z)
4
>>> sum(z)
21
>>> min(z)
1
>>> max(z)
9
>>> sum(z) / len(z)
5.25
>>> sorted(z)
[1, 4, 7, 9]
>>> sorted(z, reverse=True)
[9, 7, 4, 1]
>>> z
[4, 9, 1, 7]

sorted(z) vráti nový zoradený zoznam a pôvodný nechá tak; z.sort() zoradí priamo pôvodný zoznam. Funkcie min, max a sorted fungujú aj so zoznamom reťazcov (abecedne podľa kódov znakov).

5Kopírovanie: pozor na dve mená pre jeden zoznam

Priradenie b = a nevytvorí kópiu zoznamu – a aj b sú dve mená pre ten istý zoznam:

Python
a = [1, 2, 3]
b = a
b.append(4)
print("a =", a)
print("b =", b)

Výstup:

a = [1, 2, 3, 4]
b = [1, 2, 3, 4]

Ak chceš samostatnú kópiu, použi a.copy() alebo rez a[:]:

Python
a = [1, 2, 3]
b = a.copy()
b.append(4)
print("a =", a)
print("b =", b)

Výstup:

a = [1, 2, 3]
b = [1, 2, 3, 4]

Rovnako to platí pri funkciách: ak funkcii odovzdáš zoznam a ona ho zmení (napr. append), zmena je viditeľná aj mimo funkcie.

6Zoznam zo vstupu

Čísla na jednom riadku – rozdelíme split() a každú časť prevedieme na číslo:

Python
cisla = []
for cast in input("Čísla: ").split():
cisla.append(int(cast))
print(cisla, "súčet:", sum(cisla))

Výstup:

Čísla: 4 8 15 16 23 42
[4, 8, 15, 16, 23, 42] súčet: 108

Čísla na samostatných riadkoch – najprv počet, potom čísla:

Python
n = int(input("Počet: "))
cisla = []
for _ in range(n):
cisla.append(int(input()))
print(cisla)

Výstup:

Počet: 3
12
7
30
[12, 7, 30]

6.1Náhodný zoznam

Pomocou modulu random (téma Modulárny program) vytvoríme zoznam náhodných čísel. V ukážke je nastavené random.seed(1), aby bol výsledok vždy rovnaký:

Python
import random
​
cisla = []
for _ in range(10):
cisla.append(random.randint(1, 100))
print(cisla)
print("najväčšie:", max(cisla), "na indexe", cisla.index(max(cisla)))

Výstup:

[18, 73, 98, 9, 33, 16, 64, 98, 58, 61]
najväčšie: 98 na indexe 2

7Generátorový zápis

Zoznam, ktorý vzniká z iného zoznamu, sa dá zapísať jedným riadkom – generátorovým zápisom (list comprehension):

[výraz for prvok in postupnosť] alebo s podmienkou [výraz for prvok in postupnosť if podmienka]

>>> [x * x for x in range(1, 6)]
[1, 4, 9, 16, 25]
>>> [x for x in range(20) if x % 3 == 0]
[0, 3, 6, 9, 12, 15, 18]
>>> [slovo.upper() for slovo in ["ahoj", "svet"]]
['AHOJ', 'SVET']
>>> [int(c) for c in "2026"]
[2, 0, 2, 6]

Zápis je skratkou za tento cyklus:

Python
stvorce = []
for x in range(1, 6):
stvorce.append(x * x)
print(stvorce)

Výstup:

[1, 4, 9, 16, 25]

Načítanie zoznamu čísel zo vstupu sa tak skráti na jeden riadok: cisla = [int(x) for x in input().split()]. Náhodný zoznam: [random.randint(1, 100) for _ in range(10)].

8Riešené úlohy

8.1Priemer a nadpriemerné výsledky

Zadanie: Z bodov z písomky vypočítaj priemer a vypíš, koľko výsledkov je nad priemerom.

Riešenie: Priemer je sum / len. Potom zoznam prejdeme ešte raz a spočítame hodnoty väčšie ako priemer – na to potrebujeme mať všetky čísla uložené, preto zoznam.

Python
body = [38, 45, 22, 50, 31, 47, 28]
priemer = sum(body) / len(body)
nad = 0
for b in body:
if b > priemer:
nad += 1
print(f"Priemer: {priemer:.2f}")
print("Nad priemerom:", nad)

Výstup:

Priemer: 37.29
Nad priemerom: 4

8.2Prvky, ktoré sú v zozname iba raz

Zadanie: Vypíš prvky, ktoré sa v zozname vyskytujú práve raz, v pôvodnom poradí.

Python
z = [3, 7, 3, 1, 9, 7, 4]
jedinecne = []
for x in z:
if z.count(x) == 1:
jedinecne.append(x)
print(jedinecne)

Výstup:

[1, 9, 4]

8.3Najčastejší prvok

Zadanie: Nájdi hodnotu, ktorá sa v zozname vyskytuje najčastejšie (ak je ich viac, stačí prvá).

Riešenie: Pre každý prvok zistíme jeho počet výskytov a pamätáme si doteraz najlepší. Pre veľké zoznamy je rýchlejšie počítanie cez slovník (téma Slovníky).

Python
z = [2, 5, 2, 8, 5, 5, 1, 2, 5]
najcastejsi = z[0]
for x in z:
if z.count(x) > z.count(najcastejsi):
najcastejsi = x
print(najcastejsi, "–", z.count(najcastejsi), "krát")

Výstup:

5 – 4 krát

8.4Druhé najväčšie číslo

Zadanie: Nájdi druhú najväčšiu rôznu hodnotu v zozname (zoznam má aspoň dve rôzne hodnoty).

Riešenie: Zoradíme hodnoty bez opakovania (set odstráni duplikáty – téma Množiny) a vezmeme predposlednú. Bez množiny by sme najprv našli maximum a potom najväčší prvok, ktorý je od neho menší.

Python
z = [4, 9, 2, 9, 7, 1]
rozne = sorted(set(z))
print("Druhé najväčšie:", rozne[-2])
​
maximum = max(z)
druhe = None
for x in z:
if x < maximum and (druhe is None or x > druhe):
druhe = x
print("Druhé najväčšie:", druhe)

Výstup:

Druhé najväčšie: 7
Druhé najväčšie: 7

8.5Spoločné prvky dvoch zoznamov

Zadanie: Vypíš prvky, ktoré sa nachádzajú v oboch zoznamoch (bez opakovania).

Python
a = [1, 4, 6, 8, 4, 10]
b = [4, 5, 6, 7, 10, 12]
spolocne = []
for x in a:
if x in b and x not in spolocne:
spolocne.append(x)
print(spolocne)

Výstup:

[4, 6, 10]

8.6Párne a nepárne, zoradené

Zadanie: Rozdeľ zoznam na párne a nepárne čísla a obidva zoznamy vypíš zoradené.

Python
cisla = [15, 8, 3, 22, 7, 10, 1]
parne = sorted([x for x in cisla if x % 2 == 0])
neparne = sorted([x for x in cisla if x % 2 == 1])
print("párne:", parne)
print("nepárne:", neparne)

Výstup:

párne: [8, 10, 22]
nepárne: [1, 3, 7, 15]

9Časté chyby

  • Index mimo rozsahu (IndexError): posledný prvok je z[-1] alebo z[len(z) - 1].
  • z = z.sort(): výsledok je None; správne je z.sort() alebo z = sorted(z).
  • b = a namiesto kópie: obe mená menia ten istý zoznam; kópia je a.copy().
  • Odstraňovanie počas prechádzania: ak v cykle for x in z voláš z.remove(...), cyklus preskakuje prvky. Radšej vytvor nový zoznam s prvkami, ktoré chceš ponechať:
Python
z = [2, 4, 4, 5, 6]
for x in z:
if x % 2 == 0:
z.remove(x)
print("zle:", z)
​
z = [2, 4, 4, 5, 6]
z = [x for x in z if x % 2 != 0]
print("dobre:", z)

Výstup:

zle: [4, 5]
dobre: [5]
  • remove a index hodnoty, ktorá v zozname nie je, skončia chybou ValueError – najprv over if x in z:.

Zhrnutie

  • Zoznam [a, b, c] je usporiadaný a meniteľný; indexy a rezy fungujú ako pri reťazcoch.
  • Pridávanie: append, insert, extend; odoberanie: pop, remove; ďalej sort, reverse, count, index.
  • Metódy meniace zoznam vracajú None – ich výsledok neukladaj.
  • len, sum, min, max, sorted; priemer je sum(z) / len(z).
  • for x in z prechádza prvky, for i in range(len(z)) indexy, enumerate oboje.
  • b = a nie je kópia – použi a.copy().
  • Generátorový zápis: [výraz for x in z if podmienka].

Úlohy na precvičenie

  1. Načítaj čísla oddelené medzerou a vypíš súčet kladných a počet záporných.
  2. Vytvor zoznam 20 náhodných čísel od 1 do 6 (hody kockou) a vypíš, koľkokrát padla šestka.
  3. Vypíš zoznam odzadu bez použitia reverse a [::-1] (pomocou cyklu).
  4. Načítaj mená hostí, kým sa nezadá prázdny riadok, a vypíš ich abecedne zoradené.
  5. Posuň prvky zoznamu o jedno miesto doprava: [1, 2, 3, 4] → [4, 1, 2, 3].
  6. Napíš funkciu, ktorá vráti index najmenšieho prvku zoznamu (bez min a index).

Done reading?

Check what you remember with a few short tasks on the topic.