Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

2. diel - Tuples, množiny 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:

items = (1, 2, 3, 7)
print(items)

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 (,):

number = (1)
items = (1,)
print(number)
print(items)

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í. Tuplesread-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äť:

items = (1, 2, 3, 7)
print(items)
items_list = list(items)
items_list[1] = 4
items = tuple(items_list)
print(items)

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:

grades_january = (1, 1, 4, 2)
grades_february = (5, 3, 1)
grades = grades_january + grades_february
print(grades)

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):

planets = set(("Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"))
print(planets)
planets.add("Pluto")
print(planets)
planets.add("Neptune")
print(planets)

Vo výstupe dostaneme:

Konzolová aplikácia
{'Jupiter', 'Uranus', 'Saturn', 'Mars', 'Neptune', 'Earth'}
{'Jupiter', 'Uranus', 'Saturn', 'Mars', 'Neptune', 'Earth', 'Pluto'}
{'Jupiter', 'Uranus', 'Saturn', 'Mars', 'Neptune', 'Earth', '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á:

names = set(("Charles", "Linda", "Elizabeth"))
names.add("Evan")
names.add("Charles")
print(names)

Výstup:

Konzolová aplikácia
{'Charles', 'Linda', 'Elizabeth', 'Evan'}

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:

set_one = {1, 2, 3, 4}
set_two = {3, 4, 5, 6}
difference = set_one.difference(set_two)
print(difference)
set_one.difference_update(set_two)
print(set_one)

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:

my_set = {5, 10, 15, 20}
my_set.remove(10)
my_set.discard(10) # does not raise an error even though 10 is no longer in the set
print(my_set.pop())
print(my_set)

Výstup:

Konzolová aplikácia
20
{5, 15}

Metóda intersection()

Táto metóda nám vypočíta prienik dvoch množín:

set_one = {1, 2, 3, 4, 5}
set_two = {3, 4, 5, 6, 7}
common_elements = set_one.intersection(set_two)
print(common_elements)

Výstup:

Konzolová aplikácia
{3, 4, 5}

Metóda isdisjoint()

Určuje, či dve množiny nemajú žiadne spoločné položky (prienik):

set_one = {1, 2, 3, 4, 5}
set_two = {6, 7, 8, 9, 10}
result = set_one.isdisjoint(set_two)
print(result)

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:

set_one  = {1, 2, 3, 4}
set_two = {2, 3, 4, 5}
result_subset = set_one.issubset(set_two)
print(result_subset)
result_superset = set_one.issuperset(set_two)
print(result_superset)

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):

set_one = {1, 2, 3, 4, 5, 6}
set_one.clear()
print(set_one)

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 "John Smith" vráti napr. 114. Siahneme na 114. prvok a hľa, je tam John Smith. 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):

favorite_things = {
    'homer': 'donuts',
    'marge': 'oven',
    'bart': 'slingshot',
    'lisa': 'saxophone',
    'maggie': 'pacifier'
}

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: 'donuts', 'oven', 'slingshot', 'saxophone', 'pacifier'. 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:

print(f"Homer likes {favorite_things['homer']}")

Namiesto zápisu favorite_things[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 unikátné 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 a s 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:

favorite_things['maggie'] = 'pacifier'
print(f"Homer likes {favorite_things ['homer']}")
print(f"Maggie likes {favorite_things['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:

print(f'Number of items: {len(favorite_things)}')

Pomocou operátora in sa spýtame, či slovník obsahuje určitý kľúč. V Pythone 2.x k tomu bola určená metóda has_key(), ktorá je ale teraz zastaraná:

simpson = input("Hi, enter your favorite Simpson (from the Simpson family): ").lower()
if simpson in favorite_things:
    print(f"{simpson} likes {favorite_things[simpson]}.")
else:
    print("Hey, that's not a Simpson!")

Výsledok v konzole:

Konzolová aplikácia
Hi, enter your favorite Simpson (from the Simpson family):
homer
homer likes donuts.

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:

print(favorite_things.get('homer'))
print(favorite_things.get('krusty'))
print(favorite_things.get('krusty', 'nobody'))

Výsledok:

Konzolová aplikácia
donuts
None
nobody

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:

print(favorite_things.values())
print(favorite_things.keys())
print(favorite_things.items())

Výsledok:

Konzolová aplikácia
dict_values(['donuts', 'oven', 'slingshot', 'saxophone', 'pacifier'])
dict_keys(['homer', 'marge', 'bart', 'lisa', 'maggie'])
dict_items([('homer', 'donuts'), ('marge', 'oven'), ('bart', 'slingshot'), ('lisa', 'saxophone'), ('maggie', 'pacifier')])

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é 0x (3.69 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Python

 

Predchádzajúci článok
Úvod do kolekcií v Pythone
Všetky články v sekcii
Kolekcia v Pythone
Preskočiť článok
(neodporúčame)
Viacrozmerné zoznamy v Pythone
Článok pre vás napísal gcx11
Avatar
Užívateľské hodnotenie:
2 hlasov
(^_^)
Aktivity