IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

9. diel - Viacrozmerné polia v Pythone

V minulej lekcii, Funkcie a výnimky v Pythone , sme sa pozreli na textové reťazcoch. Dnešná tutoriál je v sekcii základných konštrukcií Pythone v podstate bonusový a pojednáva o tzv. Viacrozmerných poliach. Teoreticky môžete rovno prejsť k objektovo orientovanému programovaniu, odporúčam však si koniec tejto sekcie ešte aspoň prejsť, aby ste mali o zostávajúcich technikách povedomia. Predsa len sa jedná o dosť základné vedomosti.

Už vieme pracovať s jednorozmernými poľom, ktoré si môžeme predstaviť ako riadku priehradok v pamäti počítača.

pole - Základné konštrukcie jazyka Python

(Na obrázku je vidieť pole ôsmich čísiel)

Hoci to nie je tak časté, v programovaní sa občas stretávame aj s viacrozmernými poliami a to najmä ak programujeme nejakú simuláciu (napr. Hru).

Pole polí

Python vlastne viacrozmerné pole nepodporuje. Môžeme si v nich ale rovnako vytvoriť koľkých-rozmerné pole chceme, pretože 2D pole nie je vnútorne nič iné, než pole polí. Situáciu si môžeme predstaviť tak, že si vytvoríme polia o piatich prvkoch (1. riadok) a každá bunka v tomto riadku v sebe bude obsahovať ďalšie polia, reprezentujúci stĺpček.

Dvojrozmerné pole

Dvojrozmerné pole si môžeme v pamäti predstaviť ako tabuľku a mohli by sme takto reprezentovať napr. Rozohranú partiu piškvoriek. Ak by sme sa chceli držať reálnych aplikácií, ktoré budete neskôr v zamestnaní tvoriť, môžeme si predstaviť, že do 2D poľa budeme ukladať informácie o obsadenosť sedadiel v kinosály. Situáciu by sme si mohli graficky znázorniť napr. Nasledovne:

2D polia - Základné konštrukcie jazyka Python

(Na obrázku je vidieť 2d pole reprezentujúci obsadenosť kinosály)

Kinosála by bol v praxi samozrejme väčší, ale ako ukážka nám toto pole postačí. 0 znamená voľno, 1 obsadené. Neskôr by sme mohli doplniť aj 2 - Rezervované a podobne. Pre tieto stavy by bolo správnejšie vytvoriť si vlastný dátový typ, tzv. Zoznam (Enum), ale s ním sa stretneme až neskôr, takže si teraz musíme vystačiť iba s číslami.

2D polia vytvoríme v Pythone nasledujúcim spôsobom:

kinosal = []

for i in range(5):
    temp = []
    for j in range(5):
        temp.append(0)
    kinosal.append(temp)

Najprv si vytvoríme prázdny zoznam. Potom v prvom cykle vytvoríme dočasný zoznam temp, ktorý postupne naplníme hodnotami a potom ho 5x pridáme do zoznamu. Sami si musíme určiť, akými hodnotami budeme zoznam napĺňať, v našom prípade samými nulami.

Naplnenie dátami

Teraz kinosála naplníme jednotkami tak, ako je vidieť na obrázku vyššie. Pretože budeme ako správni programátori leniví, využijeme na vytvorenie riadku jednotiek for..in cykly :) Pre prístup k prvku 2D poľa musíme samozrejme zadať 2 súradnice. Prvý súradnice je riadok a druhá je stĺpec.

# Prostriedok
kinosal[2][2] = 1
# 4. riadok
for i in range(1, 4):
    kinosal[3][i] = 1
# Posledný riadok
for j in range(0, 5):
    kinosal[4][j] = 1

Výpis

Výpis pole opäť vykonáme pomocou cyklu, na 2d pole budeme potrebovať cykly 2 (jeden nám proiteruje stĺpce a druhý riadky). Prechádzať poľa môžeme jednoducho cyklom for..in. Alebo môžeme použiť aj "zložitejšie" spôsoby, ak chceme získať aj indexy. Napríklad range(len(seznam)) alebo funkciu enumerate().

Cykly ponoríme do seba tak, aby nám vonkajšie cyklus prechádzal riadky a vnútorné stĺpce v aktuálnom riadku. Po výpisu riadku je nutné odřádkovat. Obaja cykly musí mať samozrejme inú riadiacu premennú:

for seznam in kinosal:
    for prvek in seznam:
        print(prvek, end="")
    print(end="\n")

výsledok:

Konzolová aplikácia
00000
00000
00100
01110
11111

N-rozmerná pole

Niekedy môže byť príhodné vytvoriť si pole o ešte viac dimenziách. My všetci si iste dokážeme predstaviť minimálne 3D poľa. S príkladom s kinosálou sa ponúka prípad použitia, kedy má budova viac poschodí (alebo všeobecne viac kinosál). Vizualizácia by vyzerala asi nejako takto:

3D pole - Základné konštrukcie jazyka Python

3D poľa môžeme vytvoriť tým istým spôsobom, ako 2D poľa, ale viac komplikovanejšie:

kinosaly = []

for i in range(3):
    kinosal = []
    for j in range(5):
        temp = []
        for k in range(5):
            temp.append(0)
        kinosal.append(temp)
    kinosaly.append(kinosal)

Kód vyššie vytvorí 3D poľa ako na obrázku. Pristupovať k nemu budeme opäť cez indexy (hranaté zátvorky) ako predtým, len už musíme zadať 3 súradnice.

kinosaly[3][2][1] = 1

Skrátená inicializácia

Ešte si ukážeme, že aj viacrozmerné pole je možné rovno inicializovať hodnotami (kód vytvorí rovnú zaplnený kinosála ako na obrázku:

kinosal = [[0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0],
           [0, 0, 1, 0, 0],
           [0, 1, 1, 1, 0],
           [1, 1, 1, 1, 1]]

Zubatá pole

V niektorých prípadoch nemusíme "plytvať" pamäťou na celú tabuľku a môžeme polia vytvoriť "zubaté" (anglicky jagged):

pole polí - Základné konštrukcie jazyka Python

Nevýhodou tohto prístupu je, že musíme pole nepríjemne inicializovať sami. Pôvodný riadok s piatimi bunkami síce existuje, ale jednotlivé stĺpčeky si do neho musíme navkládat sami:

zubate = [[15, 2, 8, 5, 3],
           [3, 3, 7],
           [9, 1, 16, 13],
           [],
           [5]]

A jeho vypísanie:

for seznam in zubate:
    for prvek in seznam:
        print(prvek, end=" ")
    print(end="\n")

Na záver by som rád dodal, že niektorí ľudia, ktorí nevie správne používať objekty, využívajú 2D polí na ukladanie viac údajov o jedinej entite. Napr. budeme chcieť uložiť výšku, šírku a dĺžku piatich mobilných telefónov. Hoci sa vám teraz môže zdať, že sa jedná o úlohu na 3D pole, v skutočnosti sa jedná o úlohu na obyčajné 1D pole (presnejšie zoznam) objektov typu Telefon. Ale o tom až u objektovo orientovaného programovania. Pole si môžete vyskúšať ešte v cvičenie v tejto sekcii.

V budúcej lekcii, Knižnice math a random , sa pozrieme na matematické funkcie.


 

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

 

Predchádzajúci článok
Funkcie a výnimky v Pythone
Všetky články v sekcii
Základné konštrukcie jazyka Python
Preskočiť článok
(neodporúčame)
Knižnice math a random
Článok pre vás napísal gcx11
Avatar
Užívateľské hodnotenie:
5 hlasov
(^_^)
Aktivity