Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.

3. diel - Viacrozmerné zoznamy v Pythone Nové

V minulej lekcii, Tuples, stock a slovníky v Pythone , sme sa zamerali na tuples, množiny a slovníky.

V tomto tutoriále kolekcií v Pythone nadviažeme na základy, v ktorých sme sa zoznámili so zoznamami. Tieto znalosti teraz posunieme do vyšších dimenzií:-) Naučíme sa pracovať s viacrozmernými zoznamami.

Už teda vieme pracovať s jednorozmerným zoznamom (vo väčšine ostatných programovacích jazykov sa táto štruktúra označuje poľa), ktorý si môžeme predstaviť ako riadok priehradiek v pamäti počítača:

Štruktúra zoznamu v Pythonu - Kolekcia v Pythone - Kolekcia v Pythone

(Na obrázku je vidieť zoznam ôsmich čísel)

Dvojrozmerný zoznam

Dvojrozmerný zoznam 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í, môžeme si predstaviť, že do 2D zoznamu budeme ukladať potrebné informácie o obsadenostiach sedadiel v kinosále. Situáciu by sme si mohli graficky znázorniť napr. takto:

Štruktúra 2D zoznamu v Pythone  - Kolekcia v Pythone - Kolekcia v Pythone

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

Kinosála by bola v praxi samozrejme väčšia, ale ako ukážka nám tento zoznam postačí. Obsah bunky 0 znamená voľno, 1 obsadené. Neskôr by sme mohli doplniť aj 2 – rezervované a podobne.

Python v skutočnosti neposkytuje žiadnu dodatočnú podporu pre viacrozmerné zoznamy. To ale nevadí. Môžeme si ich totiž jednoducho deklarovať ako zoznam zoznamov. Definícia takého zoznamu pre kinosála potom vyzerá takto:

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

Najprv sme vytvorili prázdny jedno dimenzionálny zoznam kinosal. Následne som vytvorili päť ďalších zoznamov (predstavujúcich stĺpce) pomocou cyklu for. Stĺpce sme ihneď naplnili piatimi nulami použitím vnoreného cyklu a pripojili sme tento zoznam k pôvodnému ako novú položku.

Prvé číslo predstavuje číslo stĺpca, druhé číslo číslo riadku, ale mohli by sme to samozrejme urobiť aj obrátene – napríklad matice v matematike majú číslo riadku ako prvé.

Práve sme teda vytvorili tabuľku plnú núl.

Naplnenie dátami

Teraz kinosálu 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 jedničiek for cykly:) Pre prístup k prvku 2D zoznamu musíme samozrejme zadať dve súradnice:

kinosal[2][2] = 1 # střed
for i in range(1, 4): # čtvrtá řada
    kinosal[i][3] = 1
for i in range(5): # poslední řada
    kinosal[i][4] = 1

Výpis

Výpis zoznamu opäť vykonáme pomocou cyklu. Na 2D zoznam budeme potrebovať cykly dva (jeden nám proiteruje stĺpce a druhý riadky). Ako správni programátori nevložíme počet riadkov a stĺpcov do cyklov napevno, pretože sa môže zmeniť.

Už poznáme funkciu len() takže môžeme jednoducho zistiť, koľko stĺpcov je vo vonkajšom zozname a koľko položiek v tom vnútornom. Musíme myslieť aj na to, že vonkajší zoznam môže byť prázdny.

Cykly vnoríme tak, aby vonkajší cyklus iteroval cez riadky a vnútorné cez stĺpce aktuálneho riadku. Po vytlačení riadku musíme riadok prerušiť. Oba cykly musia mať inú riadiacu premennú:

sloupce = len(kinosal)
radky = 0
if sloupce:
    radky = len(kinosal[0])
for j in range(radky):
    for i in range(sloupce):
        print(kinosal[i][j], end ="")
    print()

Výsledok:

Konzolová aplikácia
00000
00000
00100
01110
11111

N-rozmerné zoznamy

Niekedy môže byť vhodné vytvoriť si zoznam o ešte viacerých dimenziách. Všetci si určite dokážeme predstaviť minimálne 3D zoznam. S príkladom s kinosálou sa ponúka prípad použitia, keď má budova viac poschodí (alebo všeobecne viac kinosál). Vizualizácia potom vyzerá napríklad takto:

3D zoznam v Pythonu - Kolekcia v Pythone - Kolekcia v Pythone

3D zoznam vytvoríme tým istým spôsobom, ako 2D zoznam:

kinosaly = []

for i in range(5):
    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 zoznamu ako na obrázku. Pristupovať k nemu budeme opäť cez indexery (hranaté zátvorky) ako predtým, len už musíme zadať tri súradnice:

kinosaly[3][2][1] = 1 # Druhý kinosál, třetí řada, čtvrtý sloupec

Skrátená inicializácia

Ešte si ukážeme, že aj viacrozmerné zoznamy je možné rovno inicializovať hodnotami (kód vytvorí rovno zaplnený kinosálu 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é zoznamy

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

Pole polí  - Kolekcia v Pythone - Kolekcia v Pythone

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

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

Na jeho vypísanie opäť využijeme vnorený cyklus:

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

Na záver dodajme, že niektorí ľudia, ktorí nevedia správne používať objekty, využívajú 2D zoznamov na ukladanie viacerých údajov o jedinej entite. Napr. budeme chcieť uložiť výšku, šírku a dĺžku piatich mobilných telefónov. Hoci sa teraz môže zdať, že sa jedná o úlohu na 3D zoznam, v skutočnosti sa jedná o úlohu na obyčajný 1D zoznam objektov triedy Telefon.

Kód príkladov je k dispozícii na konci lekcie.

V nasledujúcom kvíze, Kvíz - Tuples, stock, slovníky a zoznamy v Pythone, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

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

 

Predchádzajúci článok
Tuples, stock a slovníky v Pythone
Všetky články v sekcii
Kolekcia v Pythone
Preskočiť článok
(neodporúčame)
Kvíz - Tuples, stock, slovníky a zoznamy v Pythone
Článok pre vás napísal gcx11
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
(^_^)
Aktivity