Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. 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:

Klikni pre editáciu
  • items = (1, 2, 3, 7)
    print(items)
    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

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

    Klikni pre editáciu
    • number = (1)
      items = (1,)
      print(number)
      print(items)
      • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

      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äť:

      Klikni pre editáciu
      • items = (1, 2, 3, 7)
        print(items)
        items_list = list(items)
        items_list[1] = 4
        items = tuple(items_list)
        print(items)
        • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

        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:

        Klikni pre editáciu
        • grades_january = (1, 1, 4, 2)
          grades_february = (5, 3, 1)
          grades = grades_january + grades_february
          print(grades)
          • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

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

          Klikni pre editáciu
          • planets = set(("Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"))
            print(planets)
            planets.add("Pluto")
            print(planets)
            planets.add("Neptune")
            print(planets)
            • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

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

            Klikni pre editáciu
            • names = set(("Charles", "Linda", "Elizabeth"))
              names.add("Evan")
              names.add("Charles")
              print(names)
              • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

              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:

              Klikni pre editáciu
              • 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)
                • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                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:

                Klikni pre editáciu
                • 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)
                  • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                  Výstup:

                  Konzolová aplikácia
                  20
                  {5, 15}

                  Metóda intersection()

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

                  Klikni pre editáciu
                  • set_one = {1, 2, 3, 4, 5}
                    set_two = {3, 4, 5, 6, 7}
                    common_elements = set_one.intersection(set_two)
                    print(common_elements)
                    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                    Výstup:

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

                    Metóda isdisjoint()

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

                    Klikni pre editáciu
                    • set_one = {1, 2, 3, 4, 5}
                      set_two = {6, 7, 8, 9, 10}
                      result = set_one.isdisjoint(set_two)
                      print(result)
                      • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                      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:

                      Klikni pre editáciu
                      • 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)
                        • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

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

                        Klikni pre editáciu
                        • set_one = {1, 2, 3, 4, 5, 6}
                          set_one.clear()
                          print(set_one)
                          • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                          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:

                          Klikni pre editáciu
                          • print(f"Homer likes {favorite_things['homer']}")
                            • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                            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:

                            Klikni pre editáciu
                            • favorite_things['maggie'] = 'pacifier'
                              print(f"Homer likes {favorite_things ['homer']}")
                              print(f"Maggie likes {favorite_things['maggie']}")
                              • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                              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:

                              Klikni pre editáciu
                              • print(f'Number of items: {len(favorite_things)}')
                                • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

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

                                Klikni pre editáciu
                                • 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!")
                                  • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                                  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:

                                  Klikni pre editáciu
                                  • print(favorite_things.get('homer'))
                                    print(favorite_things.get('krusty'))
                                    print(favorite_things.get('krusty', 'nobody'))
                                    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                                    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:

                                    Klikni pre editáciu
                                    • print(favorite_things.values())
                                      print(favorite_things.keys())
                                      print(favorite_things.items())
                                      • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

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

                                       

                                      Ako sa ti páči článok?
                                      Pred uložením hodnotenia, popíš prosím autorovi, čo je zleZnakov 0 z 50-500
                                      Predchádzajúci článok
                                      Úvod do kolekcií v Pythone
                                      Všetky články v sekcii
                                      Kolekcie 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:
                                      6 hlasov
                                      (^_^)
                                      Aktivity