Slovníky

Jiný typ hodnot, které v sobě mohou obsahovat další hodnoty, je slovník. Pro příklad si představ překladový slovník, třeba česko-anglický:

  • Jablko: Apple
  • Knoflík: Button
  • Myš: Mouse

Slovník v Pythonu obsahuje záznamy, a každý záznam přiřazuje nějakému klíči nějakou hodnotu. V našem příkladu je klíči Jablko přiřazena hodnota Apple, klíči Knoflík náleží hodnota Button a klič Myš ukazuje na Mouse.

V Pythonu by se takový slovník napsal následovně:

>>> slovnik = {'Jablko': 'Apple', 'Knoflík': 'Button', 'Myš': 'Mouse'}

Naše klíče a hodnoty jsou slova – krátké texty, tedy řetězce, které je potřeba dát do uvozovek. Klíč a hodnota jsou oddělené dvojtečkou, jednotlivé dvojice se od sebe oddělují čárkou, a celý slovník je uzavřený ve složených závorkách.

Když budeš chtít v takovém slovníku něco najít, potřebuješ vědět co hledat. Potřebuješ klíč. Pomocí hranatých závorek můžeš zjistit hodnotu, která danému klíči odpovídá:

>>> slovnik['Jablko']
'Apple'

Je to podobné jako u seznamů, jen v hranatých závorkách není index (pořadí prvku) nebo rozmezí s dvojtečkou, ale klíč.

Naopak to nejde – slovník neumožňuje podle hodnoty přímo zjistit klíč. Na překlad z angličtiny do češtiny bys potřeboval/a druhý slovník.

Měnění slovníků

Co se stane, když klíč ve slovníku není?

>>> slovnik['Pes']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Pes'

Python si postěžuje na KeyError – chybu klíče.

Podobně jako seznamy se ale slovníky dají měnit. Nový záznam vytvoříš takhle:

>>> slovnik['Pes'] = 'Dog'
>>> slovnik
{'Jablko': 'Apple', 'Knoflík': 'Button', 'Myš': 'Mouse', 'Pes': 'Dog'}

Na rozdíl od překladového slovníku nemusí být Pythonní slovník seřazený podle abecedy. Není to potřeba, počítač umí rychle vyhledávat i bez seřazení.

Kdybys potřebovala/a změnit už existující záznam, použij stejný příkaz. K jednomu klíči může patřit jen jedna hodnota.

>>> slovnik['Pes'] = 'Extension cord'
>>> slovnik
{'Jablko': 'Apple', 'Knoflík': 'Button', 'Myš': 'Mouse', 'Pes': 'Extension cord'}

Chceš-li ze zlovníku nějaký záznam smazat, dělá se to podobně jako u seznamů příkazem del:

>>> del slovnik['Pes']
>>> slovnik
{'Jablko': 'Apple', 'Knoflík': 'Button', 'Myš': 'Mouse'}

A když budeš chtít zjistit, kolik je ve slovníku záznamů, zeptáš se podobně jako na počet znaků řetězce nebo prvků seznamu. Použiješ funkci len().

>>> len(slovnik)
3

Shrnutí

Skvělé! Co víš o slovnících:

  • Záznam se skládá z klíče a hodnoty.
  • Ve slovníku se hledá pomocí klíče.
  • Záznamy se dají přepsat, přidat, nebo pomocí del smazat.

Jsi připraven/a na další část?

{
  "data": {
    "sessionMaterial": {
      "id": "session-material:2018/snake-brno-codeweek:intro:7",
      "title": "SlovnĂ­ky",
      "html": "\n          \n    \n\n    <h1>Slovn&#xED;ky</h1>\n<p>Jin&#xFD; typ hodnot, kter&#xE9; v&#xA0;sob&#x11B; mohou obsahovat dal&#x161;&#xED; hodnoty, je <em>slovn&#xED;k</em>.\nPro p&#x159;&#xED;klad si p&#x159;edstav p&#x159;ekladov&#xFD; slovn&#xED;k, t&#x159;eba &#x10D;esko-anglick&#xFD;:</p>\n<ul>\n<li><strong>Jablko</strong>: Apple</li>\n<li><strong>Knofl&#xED;k</strong>: Button</li>\n<li><strong>My&#x161;</strong>: Mouse</li>\n</ul>\n<p>Slovn&#xED;k v&#xA0;Pythonu obsahuje z&#xE1;znamy, a ka&#x17E;d&#xFD; z&#xE1;znam p&#x159;i&#x159;azuje\nn&#x11B;jak&#xE9;mu <em>kl&#xED;&#x10D;i</em> n&#x11B;jakou <em>hodnotu</em>.\nV&#xA0;na&#x161;em p&#x159;&#xED;kladu je kl&#xED;&#x10D;i <em>Jablko</em> p&#x159;i&#x159;azena hodnota <em>Apple</em>,\nkl&#xED;&#x10D;i <em>Knofl&#xED;k</em> n&#xE1;le&#x17E;&#xED; hodnota <em>Button</em>\na kli&#x10D; <em>My&#x161;</em> ukazuje na <em>Mouse</em>.</p>\n<p>V&#xA0;Pythonu by se takov&#xFD; slovn&#xED;k napsal n&#xE1;sledovn&#x11B;:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">slovnik</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&apos;Jablko&apos;</span><span class=\"p\">:</span> <span class=\"s1\">&apos;Apple&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;Knofl&#xED;k&apos;</span><span class=\"p\">:</span> <span class=\"s1\">&apos;Button&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;My&#x161;&apos;</span><span class=\"p\">:</span> <span class=\"s1\">&apos;Mouse&apos;</span><span class=\"p\">}</span>\n</pre></div><p>Na&#x161;e kl&#xED;&#x10D;e a hodnoty jsou slova &#x2013; kr&#xE1;tk&#xE9; texty, tedy &#x159;et&#x11B;zce,\nkter&#xE9; je pot&#x159;eba d&#xE1;t do uvozovek.\nKl&#xED;&#x10D; a hodnota jsou odd&#x11B;len&#xE9; dvojte&#x10D;kou,\njednotliv&#xE9; dvojice se od sebe odd&#x11B;luj&#xED; &#x10D;&#xE1;rkou,\na cel&#xFD; slovn&#xED;k je uzav&#x159;en&#xFD; ve slo&#x17E;en&#xFD;ch z&#xE1;vork&#xE1;ch.</p>\n<p>Kdy&#x17E; bude&#x161; cht&#xED;t v&#xA0;takov&#xE9;m slovn&#xED;ku n&#x11B;co naj&#xED;t, pot&#x159;ebuje&#x161; v&#x11B;d&#x11B;t co hledat.\nPot&#x159;ebuje&#x161; <em>kl&#xED;&#x10D;</em>.\nPomoc&#xED; hranat&#xFD;ch z&#xE1;vorek m&#x16F;&#x17E;e&#x161; zjistit hodnotu, kter&#xE1; dan&#xE9;mu kl&#xED;&#x10D;i odpov&#xED;d&#xE1;:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">slovnik</span><span class=\"p\">[</span><span class=\"s1\">&apos;Jablko&apos;</span><span class=\"p\">]</span>\n<span class=\"go\">&apos;Apple&apos;</span>\n</pre></div><p>Je to podobn&#xE9; jako u seznam&#x16F;, jen v&#xA0;hranat&#xFD;ch z&#xE1;vork&#xE1;ch nen&#xED; index\n(po&#x159;ad&#xED; prvku) nebo rozmez&#xED; s dvojte&#x10D;kou, ale kl&#xED;&#x10D;.</p>\n<div class=\"admonition note\"><p>Naopak to nejde &#x2013; slovn&#xED;k neumo&#x17E;&#x148;uje podle hodnoty p&#x159;&#xED;mo zjistit kl&#xED;&#x10D;.\nNa p&#x159;eklad z angli&#x10D;tiny do &#x10D;e&#x161;tiny bys pot&#x159;eboval/a druh&#xFD; slovn&#xED;k.</p>\n</div><h2>M&#x11B;n&#x11B;n&#xED; slovn&#xED;k&#x16F;</h2>\n<p>Co se stane, kdy&#x17E; kl&#xED;&#x10D; ve slovn&#xED;ku nen&#xED;?</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">slovnik</span><span class=\"p\">[</span><span class=\"s1\">&apos;Pes&apos;</span><span class=\"p\">]</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n  File <span class=\"nb\">&quot;&lt;stdin&gt;&quot;</span>, line <span class=\"m\">1</span>, in <span class=\"n\">&lt;module&gt;</span>\n<span class=\"gr\">KeyError</span>: <span class=\"n\">&apos;Pes&apos;</span>\n</pre></div><p>Python si post&#x11B;&#x17E;uje na <code>KeyError</code> &#x2013; chybu kl&#xED;&#x10D;e.</p>\n<p>Podobn&#x11B; jako seznamy se ale slovn&#xED;ky daj&#xED; m&#x11B;nit.\nNov&#xFD; z&#xE1;znam vytvo&#x159;&#xED;&#x161; takhle:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">slovnik</span><span class=\"p\">[</span><span class=\"s1\">&apos;Pes&apos;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;Dog&apos;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">slovnik</span>\n<span class=\"go\">{&apos;Jablko&apos;: &apos;Apple&apos;, &apos;Knofl&#xED;k&apos;: &apos;Button&apos;, &apos;My&#x161;&apos;: &apos;Mouse&apos;, &apos;Pes&apos;: &apos;Dog&apos;}</span>\n</pre></div><div class=\"admonition note\"><p>Na rozd&#xED;l od p&#x159;ekladov&#xE9;ho slovn&#xED;ku nemus&#xED; b&#xFD;t Pythonn&#xED; slovn&#xED;k se&#x159;azen&#xFD;\npodle abecedy.\nNen&#xED; to pot&#x159;eba, po&#x10D;&#xED;ta&#x10D; um&#xED; rychle vyhled&#xE1;vat i bez se&#x159;azen&#xED;.</p>\n</div><p>Kdybys pot&#x159;ebovala/a zm&#x11B;nit u&#x17E; existuj&#xED;c&#xED; z&#xE1;znam, pou&#x17E;ij stejn&#xFD; p&#x159;&#xED;kaz.\nK&#xA0;jednomu kl&#xED;&#x10D;i m&#x16F;&#x17E;e pat&#x159;it jen jedna hodnota.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">slovnik</span><span class=\"p\">[</span><span class=\"s1\">&apos;Pes&apos;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;Extension cord&apos;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">slovnik</span>\n<span class=\"go\">{&apos;Jablko&apos;: &apos;Apple&apos;, &apos;Knofl&#xED;k&apos;: &apos;Button&apos;, &apos;My&#x161;&apos;: &apos;Mouse&apos;, &apos;Pes&apos;: &apos;Extension cord&apos;}</span>\n</pre></div><p>Chce&#x161;-li ze zlovn&#xED;ku n&#x11B;jak&#xFD; z&#xE1;znam smazat, d&#x11B;l&#xE1; se to podobn&#x11B; jako\nu seznam&#x16F; p&#x159;&#xED;kazem <code>del</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">del</span> <span class=\"n\">slovnik</span><span class=\"p\">[</span><span class=\"s1\">&apos;Pes&apos;</span><span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">slovnik</span>\n<span class=\"go\">{&apos;Jablko&apos;: &apos;Apple&apos;, &apos;Knofl&#xED;k&apos;: &apos;Button&apos;, &apos;My&#x161;&apos;: &apos;Mouse&apos;}</span>\n</pre></div><p>A kdy&#x17E; bude&#x161; cht&#xED;t zjistit, kolik je ve slovn&#xED;ku z&#xE1;znam&#x16F;,\nzept&#xE1;&#x161; se podobn&#x11B; jako na po&#x10D;et znak&#x16F; &#x159;et&#x11B;zce nebo prvk&#x16F; seznamu.\nPou&#x17E;ije&#x161; funkci <code>len()</code>.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">slovnik</span><span class=\"p\">)</span>\n<span class=\"go\">3</span>\n</pre></div><h2>Shrnut&#xED;</h2>\n<p>Skv&#x11B;l&#xE9;! Co v&#xED;&#x161; o slovn&#xED;c&#xED;ch:</p>\n<ul>\n<li><strong>Z&#xE1;znam</strong> se skl&#xE1;d&#xE1; z&#xA0;<strong>kl&#xED;&#x10D;e</strong> a <strong>hodnoty</strong>.</li>\n<li>Ve slovn&#xED;ku se hled&#xE1; pomoc&#xED; <strong>kl&#xED;&#x10D;e</strong>.</li>\n<li>Z&#xE1;znamy se daj&#xED; p&#x159;epsat, p&#x159;idat, nebo pomoc&#xED; <code>del</code> smazat.</li>\n</ul>\n<p>Jsi p&#x159;ipraven/a na dal&#x161;&#xED; &#x10D;&#xE1;st?</p>\n\n\n        "
    }
  }
}