2. diel - Tuples, stock a slovníky v Pythone
V predchádzajúcej lekcii, Úvod do kolekcií v Pythone , sme zistili, čo sú v Pythone kolekcie a čo znamená pojem genericita.
V tomto tutoriále kolekcií v Pythone sa zameriame na tuples, množiny a slovníky. Vysvetlíme si, na čo sa používajú a čím sa od seba líšia. Popíšeme si aj základné metódy, ktoré na prácu s týmito kolekciami budeme používať.
Tuples v Pythone
Tuples (niekedy tiež usporiadané n -tice) sa veľmi podobajú zoznamom. Ide o sekvencie, v ktorých ale položky nie je možné ďalej modifikovať. Jednotlivé položky sa oddeľujú čiarkou. Deklarujeme ich pomocou okrúhlych zátvoriek:
polozky= (1, 2, 3, 7)
print(polozky)
Výstup:
Konzolová aplikácia
(1, 2, 3, 7)
Je tu ale malý háčik v prípade, že chceme deklarovať tuple
s jedinou položkou. Aby sme ju odlíšili od bežnej hodnoty premennej, musíme
za položkou napísať čiarku (,
):
cislo= (1)
polozky= (1,)
print(cislo)
print(polozky)
Výstup:
Konzolová aplikácia
1
(1,)
Kolekciu tuple
používame, keď potrebujeme niekde odovzdať
sekvenciu a chceme sa uistiť, že sa náhodou nezmení.
Tuples
sú read-only, takže ak potrebujeme
tuple
z nejakého dôvodu modifikovať, musíme vytvoriť novú s
takými položkami, ktoré práve potrebujeme. To dosiahneme napríklad
prevodom tuple
na zoznam a zase späť:
polozky = (1, 2, 3, 7)
print(polozky)
polozky_seznam = list(polozky)
polozky_seznam[1] = 4
polozky = tuple(polozky_seznam)
print(polozky)
Výstup:
Konzolová aplikácia
(1, 2, 3, 7)
(1, 4, 3, 7)
V kóde je dôležitá metóda tuple()
ktorá na
tuple
prevádza iné sekvencie. N -tice môžu byť tiež
zlúčené do seba prostredníctvom operátora +
. Toto platí pre
akýkoľvek typ sekvencie:
znamky_leden = (1, 1, 4, 2)
znamky_unor = (5, 3, 1)
znamky = znamky_leden + znamky_unor
print(znamky)
Výsledok:
Konzolová aplikácia
(1, 1, 4, 2, 5, 3, 1)
To isté platí pre zoznamy. Nie je však možné kombinovať zoznamy a n -tice bez explicitného prevodu na rovnaký dátový typ.
Na zistenie, koľko položiek naša tuple
obsahuje, použijeme
globálnu funkciu len()
. Môžeme použiť aj funkcie
min()
a max()
na určenie najnižšej a najvyššej
hodnoty (jednoducho ako pri každej sekvencii v Pythone). Môžeme tiež
použiť operátor in
, cyklus for
, operátor
[]
pre indexy atď.
Množiny v Pythone
Množina alebo set
je druh sekvencie podobnej zoznamu s tým
rozdielom, že môže obsahovať len unikátne položky (každá položka môže
byť v množine iba raz). Čo tiež zodpovedá matematickej
definícii pre množiny. Tieto položky nie sú zotriedené,
čo znamená že poradie položiek nie je udržiavané a môže sa
nepredvídateľne zmeniť. Pre množiny nie je žiadna zvláštna syntax ako v
prípade zoznamov či n -tic, vytvárame ich jednoducho použitím
globálnej funkcie set()
, ktoré do parametra vložíme sekvenciu
(aj už existujúcu):
planety = set(("Země", "Mars", "Jupiter", "Saturn", "Uran", "Neptun"))
print(planety)
planety.add("Pluto")
print(planety)
planety.add("Neptun")
print(planety)
Vo výstupe dostaneme:
Konzolová aplikácia
{'Jupiter', 'Uran', 'Saturn', 'Mars', 'Neptun', 'Země'}
{'Jupiter', 'Uran', 'Saturn', 'Mars', 'Neptun', 'Země', 'Pluto'}
{'Jupiter', 'Uran', 'Saturn', 'Mars', 'Neptun', 'Země', 'Pluto'}
V ukážke vyššie sme vytvorili množinu šiestich mien planét. Dvojité
zátvorky na riadku s funkciou set()
znamenajú, že sme odovzdali
názvy planét formou n -tice ako parameter tejto
funkcii. Poradie položiek nie je zoradené podľa abecedy, a nezmení
sa ani po pridaní novej položky. To ale nie je žiadna chyba, pretože
položky sú vnútorne udržiavané v poradí, čo pomáha množine efektívne
určiť jedinečnosť každej položky.
Metódy množín
Pozrime sa na základné metódy pre operácie s množinami.
Metóda add()
Pomocou metódy add()
pridávame položky do množiny. Z
predchádzajúceho príkladu je zrejmé, že pokiaľ sa pokúsime pridať do
množiny už raz obsiahnutý prvok, nevyskočí žiadna chyba, ale
položka jednoducho nie je pridaná:
seznam = set(("Karel", "Lida", "Alzbeta"))
seznam.add("Ivo")
seznam.add("Karel")
print(seznam)
Výstup:
Konzolová aplikácia
{'Karel', 'Lida', 'Alzbeta', 'Ivo'}
Metódy
difference()
a difference_update()
Ako sa dalo čakať, množina poskytuje všetky množinové operácie, ktoré
poznáme z matematických tried. Môžeme sa napríklad opýtať na rozdiel
medzi dvoma množinami. Metóda difference()
vracia tento rozdiel
dvoch množín ako novú množinu. Metóda difference_update()
naproti tomu upravuje existujúcu množinu a odstráni všetky položky z druhej
množiny:
mnozinaJedna = {1, 2, 3, 4}
mnozinaDva = {3, 4, 5, 6}
rozdil = mnozinaJedna.difference(mnozinaDva)
print(rozdil)
mnozinaJedna.difference_update(mnozinaDva)
print(mnozinaJedna)
Výstup:
Konzolová aplikácia
{1, 2}
{1, 2}
Metódy remove()
,
discard()
, a pop()
Všetky z týchto troch metód odstránia vybranú položku
z množiny. Metóda remove()
vyhodí chybu, pokiaľ sa hľadaná
položka v množine nevyskytuje. Metóda discard()
sa chová úplne
totožne, len pri absencii položky zamýšľanej na odstránenie chybu
nevyvolá. Metóda pop()
potom vyberie náhodnú hodnotu z množiny
a tú potom vráti:
mnozina = {5, 10, 15, 20}
mnozina.remove(10)
mnozina.discard(10) # nevyvolá chybu, přestože hodnota 10 už v množině není
print(mnozina.pop())
print(mnozina)
Výstup:
Konzolová aplikácia
20
{5, 15}
Metóda intersection()
Táto metóda nám vypočíta prienik dvoch množín:
mnozinaJedna = {1, 2, 3, 4, 5}
mnozinaDva = {3, 4, 5, 6, 7}
spolecne_prvky = mnozinaJedna.intersection(mnozinaDva)
print(spolecne_prvky)
Výstup:
Konzolová aplikácia
{3, 4, 5}
Metóda isdisjoint()
Určuje, či dve množiny nemajú žiadne spoločné položky (prienik):
mnozinaJedna = {1, 2, 3, 4, 5}
mnozinaDva = {6, 7, 8, 9, 10}
vysledek = mnozinaJedna.isdisjoint(mnozinaDva)
print(vysledek)
Výstup:
Konzolová aplikácia
True
Metódy issubset()
a
issuperset()
Môžeme sa opýtať, či je množina podmnožinou (všetky jej položky sú
prítomné v druhej množine) alebo nadmnožinou (sú v nej prítomné všetky
položky druhej množiny) pomocou metód issubset()
pre podmnožinu
a issuperset()
nadmnožinu:
mnozinaJedna = {1, 2, 3, 4}
mnozinaDva = {2, 3, 4, 5}
vysledekSubset = mnozinaJedna.issubset(mnozinaDva)
print(vysledekSubset)
vysledekSuperset = mnozinaJedna.issuperset(mnozinaDva)
print(vysledekSuperset)
Výstup:
Konzolová aplikácia
False
False
Metóda clear()
Táto metóda odstráni všetky položky z množiny (vyčistí ju):
mnozinaJedna = {1, 2, 3, 4, 5, 6}
mnozinaJedna.clear()
print(mnozinaJedna)
Výstup:
Konzolová aplikácia
set()
Slovníky
Slovník (Dictionary) funguje tiež podobne ako zoznam, až na to, že k nemu nepristupujeme len pomocou indexov, ale aj na základe kľúčových hodnôt rôznych, avšak nemenných dátových typov. Index slovníkov nazývame kľúč. Na poradí jednotlivých položiek v slovníku nezáleží.
Dáta v sekvencii sú uložené špeciálnym spôsobom, tzv. hashovaním. To nám umožňuje pristupovať k prvkom pomocou kľúča oveľa rýchlejšie, než keby sme ich podľa tejto vlastnosti hľadali napr. v obyčajnom zozname. Zatiaľ čo pri zozname je potrebné všetky prvky prejsť a kontrolovať, či náhodou ich vlastnosť nezodpovedá tomu, čo hľadáme, slovník dokáže pre prvok siahnuť oveľa rýchlejšie vďaka výpočtu tzv. hasha (odtlačku). Môžeme si to predstaviť tak, že máme prvky v obyčajnom zozname. Nie sú však bezprostredne za sebou, nejaké indexy nie sú využité vôbec. Finta spočíva v tom, že sme schopní z kľúča zistiť index prvku pomocou hashovacej funkcie. Pokiaľ budeme mať v slovníku uložených zamestnancov a kľúčom bude ich meno, hashovacia funkcia nám z "Jan Novák" vráti napr. 114. Siahneme na 114. prvok a hľa, je tam Ján Novák. Nemusíme slovník nijako iterovať.
Slovník deklarujeme rovnako ako zoznam. Hlavný rozdiel je v tom, že
používame zložené zátvorky a musíme k položkám definovať aj ich
kľúče. Na to používame operátor dvojbodka :
. Slovníky sú
teda použité na uloženie hodnôt v pároch kľúč:hodnota
(key:value):
oblibeneVeci= { 'homer': 'koblihy', 'marge': 'trouba', 'bart': 'prak', 'lisa': 'saxofon', 'maggie': 'dudlik' }
Zápis položiek sme rozdelili kvôli prehľadnosti do viacerých riadkov,
ale išlo by to aj v jednom. V slovníku máme päť hodnôt:
'kobliha'
, 'trouba'
, 'prak'
,
'saxofon'
, 'dudlík'
. Každá hodnota patrí nejakému
kľúču ('homer'
, 'marge'
, 'bart'
,
'lisa'
a 'maggie'
). Hodnoty priradíme ku kľúču
pomocou dvojbodky (:
) a oddeľujeme čiarkou, ktorá sa väčšinou
píše aj za poslednou položkou.
Pre prácu so slovníkom platí to isté, čo sme si ukazovali pri zozname:
oblibeneVeci= {
'homer': 'koblihy',
'marge': 'trouba',
'bart': 'prak',
'lisa': 'saxofon'
}
print(f"Homer má rád {oblibeneVeci['homer']}")
Namiesto zápisu oblibeneVeci[0]
sme použili kľúč typu
string
. Veľkou výhodou použitia slovníka je lepšia
čitateľnosť, kedy priamo vidíme, akú hodnotu zo slovníka
dostávame. Zatiaľ čo pri číselných indexoch možno ani nevieme, o akú
hodnotu ide. Každý kľúč musí byť unikátny, ale hodnoty
také byť nemusia. Pary kľúč: hodnota môžu byť akékoľvek
nemenné dátové typy. Pokiaľ definujeme rovnaký kľúč v rovnakom
slovníku viackrát as rôznymi hodnotami, bude kľúču priradená posledná
hodnota.
Pridávanie položiek
Do slovníka môžeme jednoducho pridávať ďalšie položky priradením nových kľúčov:
oblibeneVeci= {
'homer': 'koblihy',
'marge': 'trouba',
'bart': 'prak',
'lisa': 'saxofon'
}
oblibeneVeci['maggie'] = 'dudlik'
print(f"Homer má rád {oblibeneVeci['homer']}")
print(f"Maggie má ráda {oblibeneVeci['maggie']}")
Rovnakým spôsobom môžeme modifikovať už uložené hodnoty.
Na zistenie počtu položiek v slovníku použijeme globálnu funkciu
len()
známu už zo zoznamov:
oblibeneVeci= {
'homer': 'koblihy',
'marge': 'trouba',
'bart': 'prak',
'lisa': 'saxofon',
'maggie':'dudlík'
}
print(f'Počet položek: {len(oblibeneVeci)}')
Pomocou operátora in
sa spýtame, či slovník obsahuje
určitý kľúč. V Pythone 2.xk tomu bola určená metóda
has_key()
, ktorá je ale teraz zastaraná:
oblibeneVeci= {
'homer': 'koblihy',
'marge': 'trouba',
'bart': 'prak',
'lisa': 'saxofon',
'maggie':'dudlík'
}
simpson = input("Ahoj, zadej svého oblíbeného Simpsona (z rodiny Simpsonů): ").lower()
if simpson in oblibeneVeci:
print(f"{simpson} má rád {oblibeneVeci[simpson]}.")
else:
print("Hele, tohle není Simpson!")
Výsledok v konzole:
Konzolová aplikácia
Ahoj, zadej svého oblíbeného Simpsona (z rodiny Simpsonů):
homer
homer má rád koblihy.
Metódy slovníkov
Podobne ako pri zoznamoch existuje aj pre slovníky niekoľko dostupných metód. Pozrime sa na tie najdôležitejšie.
Metóda get()
Metóda get()
ponúka ďalší spôsob na získanie položky zo
slovníka. Hlavnou výhodou tejto metódy je, že nevyhodí žiadnu výnimku v
prípade, že hľadaný kľúč v slovníku nie je. Namiesto toho vráti hodnotu
None
alebo niektorú východiskovú hodnotu, špecifikovateľnú v
druhom parametri:
oblibeneVeci= {
'homer': 'koblihy',
'marge': 'trouba',
'bart': 'prak',
'lisa': 'saxofon',
'maggie':'dudlík'
}
print(oblibeneVeci.get('homer'))
print(oblibeneVeci.get('krusty'))
print(oblibeneVeci.get('krusty', 'nikdo'))
Výsledok:
Konzolová aplikácia
koblihy
None
nikdo
Metódy values()
,
keys()
, a items()
Pomocou týchto metód môžeme previesť slovník na zoznam. Môžeme tak vyčleniť hodnoty, kľúče alebo dokonca vytvoriť zoznamy n -tic párov kľúč-hodnota:
oblibeneVeci= {
'homer': 'koblihy',
'marge': 'trouba',
'bart': 'prak',
'lisa': 'saxofón',
'maggie':'dudlík'
}
print(oblibeneVeci.values())
print(oblibeneVeci.keys())
print(oblibeneVeci.items())
Výsledok:
Konzolová aplikácia
dict_values(['koblihy', 'trouba', 'prak', 'saxofon', 'dudlík'])
dict_keys(['homer', 'marge', 'bart', 'lisa', 'maggie'])
dict_items([('homer', 'koblihy'), ('marge', 'trouba'), ('bart', 'prak'), ('lisa', 'saxofon'), ('maggie', 'dudlík')])
Metóda clear()
Ako samotný názov naznačuje, táto metóda "vyčistí" všetky položky zo slovníka.
Kód je opäť k dispozícii na konci lekcie.
V budúcej lekcii, Viacrozmerné zoznamy v Pythone , sa pozrieme na dvojrozmerné (2D) a viacrozmerné zoznamy, vrátane príkladov a zoznamov "zubatých".
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 115x (3.53 MB)
Aplikácia je vrátane zdrojových kódov v jazyku Python