Iterátory n-tic

Některé hodnoty v Pythonu jsou iterovatelné (angl. iterable): obsahují sekvenci jiných hodnot a lze je „projít“ (iterovat) cyklem for nebo je převést na seznam. Už jich známe několik:

>>> list(range(10))                 # sekvence čísel
>>> list('ahoj')                    # řetězec
>>> list(['Ahoj', 'Hello', 'Hei'])  # seznam
>>> list((12, 'Sr', True))          # n-tice

Spousta těchto typů umí něco navíc: zjistit jestli obsahují nějaký prvek (4 in range(10)), zjistit délku (len([1, 2, 3])), převést na velká písmena ('abc'.upper()). Nic z toho ale není potřeba, aby byl objekt iterovatelný.

Podívejme se na dva dalších iterovatelné objekty: enumerate a zip.

Enumerate: očíslování sekvence

Funkce enumerate vezme nějakou existující sekvenci a očísluje ji: ve vrácené sekvenci budou dvojice (index, původní hodnota).

Řekněme že máš tento seznam:

trpaslici = ['Prófa', 'Stydlín', 'Dřímal', 'Kejchal', 'Štístko',
             'Šmudla', 'Rejpal']

Když na něj použiješ enumerate, dostaneš objekt enumerate, který podobně jako range() neukáže svůj obsah „rovnou“, ale můžeš se „do něj“ podívat převedením na seznam. Uvidíš tak seznam dvojic (číslo, trpaslík):

>>> enumerate(trpaslici)
<enumerate object at 0x7f0db61b29d8>
>>> list(enumerate(trpaslici))
[(0, 'Prófa'), (1, 'Stydlín'), (2, 'Dřímal'), (3, 'Kejchal'), (4, 'Štístko'), (5, 'Šmudla'), (6, 'Rejpal')]

Místo převedení na seznam můžeš přes objekt enumerate iterovat cyklem for a pro každou dvojici něco udělat. Třeba ji hezky vypsat:

for dvojice in enumerate(trpaslici):
    # Rozbalení dvojice
    index, trpaslik = dvojice
    # Vypsání
    print(f'Na pozici {index} je {trpaslik}!')

Objekt, který funkce enumerate vrací, je iterátor dvojic – sekvence, jejíž prvky jsou dvojice.

Rozbalování v cyklu for

„Trpasličí“ cyklus se dá rozepsat takto:

dvojice = 0, 'Prófa'    # toto dělá `for`
index, trpaslik = dvojice
print(f'Na pozici {index} je {trpaslik}!')

dvojice = 1, 'Stydlín'  # toto dělá `for`
index, trpaslik = dvojice
print(f'Na pozici {index} je {trpaslik}!')

dvojice = 2, 'Dřímal'  # toto dělá `for`
index, trpaslik = dvojice
print(f'Na pozici {index} je {trpaslik}!')

# A tak dále

Kdybys to psala ručně, lze to zjednodušit – přiřadit do dvou proměnných najedno, bez pomocné dvojice:

index, trpaslik = 0, 'Prófa'    # toto by mohl dělat `for`
print(f'Na pozici {index} je {trpaslik}!')

index, trpaslik = 1, 'Stydlín'  # toto by mohl dělat `for`
print(f'Na pozici {index} je {trpaslik}!')

index, trpaslik = 2, 'Dřímal'  # toto by mohl dělat `for`
print(f'Na pozici {index} je {trpaslik}!')

# A tak dále

A for tohle ve skutečnosti umí: místo do proměnné dvojice může přiřadit rovnou do dvou proměnných index, trpaslik:

for index, trpaslik in enumerate(trpaslici):
    print(f'Na pozici {index} je {trpaslik}!')

Tohle je docela častẙ způsob práce s iterátorem n-tic – máš-li sekvenci, jejíž prvky jsou n-tice, můžeš jednotlivé součásti n-tice rozbalit přímo v hlavičce for cyklu.

Zkus si to! Zkopíruj si tento seznam:

dny = ['Po', 'Út', 'St', 'Čt', 'Pá', 'So', 'Ne']

… a zkus vypsat:

1. Po
2. Út
3. St
4. Čt
5. Pá
6. So
7. Ne

Řešení

Zip: Víc iterací najednou

Další iterátor n-tic je funkce zip, která umí projít dvě sekvence naráz. Řekněme že máš seznam věcí a k nim příslušných barev:

veci = ['tráva', 'slunce', 'mrkev', 'řeka']
barvy = ['zelená', 'žluté', 'oranžová', 'modrá']

Kdtyž tyto dva seznamy dáš funkci zip, dostaneš iterátor který příslušné hodnoty spáruje. Bude tedy obsahovat:

  • Dvojici prvních prvků obou seznamů
  • Dvojici druhých prvků obou seznamů
  • Dvojici třetích prvků obou seznamů
  • ...
for vec, barva in zip(veci, barvy):
    print(f"{vec} je {barva}")

Funguje to i pro více sekvencí. V následujícím případě je výsledný zip iterátor čtveřic (věc, barva, místo, číslo):

veci = ['tráva', 'slunce', 'mrkev', 'řeka']
barvy = ['zelená', 'žluté', 'oranžová', 'modrá']
mista = ['na zemi', 'nahoře', 'na talíři', 'za zídkou']
cisla = range(4)

for vec, barva, misto, cislo in zip(veci, barvy, mista, cisla):
    print(f"{cislo}. {barva} {vec} je {misto}")

Když si ale vypíšeš samotný objekt zip, zjistíš že o sobě nic moc neřekne – podobně jako enumerate:

>>> zip(veci, barvy, mista, cisla)
<zip object at 0x7f0db61b1f48>

Zip Longest: Pro ty co chtějí všechno

Jak se zip chová, když dostane seznamy různých délek?

veci = ['tráva', 'slunce', 'mrkev', 'řeka', 'myšlenka', 'spravedlnost']
barvy = ['zelená', 'žluté', 'oranžová', 'modrá']
for vec, barva in zip(veci, barvy):
    print(f"{vec} je {barva}")

Řešení

Občas je potřeba projít všechny záznamy. Na to slouží funkce zip_longest z modulu itertools:

from itertools import zip_longest
for vec, barva in zip_longest(veci, barvy, fillvalue='(nevím)'):
    print(f"{vec} je {barva}")

Argument fillvalue říká, co se doplní za chybějící hodnoty. Když ho nezadáš, doplní se None („nic“, hodnota kterou např. vrací procedury). To se často používá, když je pro chybějící hodnoty potřeba nějaká složitější logika:

from itertools import zip_longest
for vec, barva in zip_longest(veci, barvy):
    if vec == None:
        vec = 'nějaká věc'
    if barva == None:
        barva = 'bez barvy'
    print(f"{vec} je {barva}")
{
  "data": {
    "sessionMaterial": {
      "id": "session-material:2019/brno-jaro-2019-pondeli:solitaire:1",
      "title": "IterĂ¡tory n-tic",
      "html": "\n          \n    \n\n    <h1>Iter&#xE1;tory n-tic</h1>\n<p>N&#x11B;kter&#xE9; hodnoty v Pythonu jsou <em>iterovateln&#xE9;</em> (angl. <em>iterable</em>):\nobsahuj&#xED; sekvenci jin&#xFD;ch hodnot a lze je &#x201E;proj&#xED;t&#x201C; (iterovat) cyklem <code>for</code> nebo\nje p&#x159;ev&#xE9;st na seznam.\nU&#x17E; jich zn&#xE1;me n&#x11B;kolik:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">10</span><span class=\"p\">))</span>                 <span class=\"c1\"># sekvence &#x10D;&#xED;sel</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"s1\">&apos;ahoj&apos;</span><span class=\"p\">)</span>                    <span class=\"c1\"># &#x159;et&#x11B;zec</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">list</span><span class=\"p\">([</span><span class=\"s1\">&apos;Ahoj&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;Hello&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;Hei&apos;</span><span class=\"p\">])</span>  <span class=\"c1\"># seznam</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">list</span><span class=\"p\">((</span><span class=\"mi\">12</span><span class=\"p\">,</span> <span class=\"s1\">&apos;Sr&apos;</span><span class=\"p\">,</span> <span class=\"bp\">True</span><span class=\"p\">))</span>          <span class=\"c1\"># n-tice</span>\n</pre></div><p>Spousta t&#x11B;chto typ&#x16F; um&#xED; n&#x11B;co nav&#xED;c: zjistit jestli obsahuj&#xED; n&#x11B;jak&#xFD; prvek\n(<code>4 in range(10)</code>), zjistit d&#xE9;lku (<code>len([1, 2, 3])</code>), p&#x159;ev&#xE9;st na velk&#xE1; p&#xED;smena\n(<code>&apos;abc&apos;.upper()</code>).\nNic z&#xA0;toho ale nen&#xED; pot&#x159;eba, aby byl objekt iterovateln&#xFD;.</p>\n<p>Pod&#xED;vejme se na dva dal&#x161;&#xED;ch iterovateln&#xE9; objekty: <code>enumerate</code> a <code>zip</code>.</p>\n<h2>Enumerate: o&#x10D;&#xED;slov&#xE1;n&#xED; sekvence</h2>\n<p>Funkce <code>enumerate</code> vezme n&#x11B;jakou existuj&#xED;c&#xED; sekvenci a <em>o&#x10D;&#xED;sluje ji</em>:\nve vr&#xE1;cen&#xE9; sekvenci budou dvojice (index, p&#x16F;vodn&#xED; hodnota).</p>\n<p>&#x158;ekn&#x11B;me &#x17E;e m&#xE1;&#x161; tento seznam:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">trpaslici</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&apos;Pr&#xF3;fa&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;Stydl&#xED;n&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;D&#x159;&#xED;mal&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;Kejchal&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;&#x160;t&#xED;stko&apos;</span><span class=\"p\">,</span>\n             <span class=\"s1\">&apos;&#x160;mudla&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;Rejpal&apos;</span><span class=\"p\">]</span>\n</pre></div><p>Kdy&#x17E; na n&#x11B;j pou&#x17E;ije&#x161; <code>enumerate</code>, dostane&#x161; objekt <code>enumerate</code>,\nkter&#xFD; podobn&#x11B; jako <code>range()</code> neuk&#xE1;&#x17E;e sv&#x16F;j obsah &#x201E;rovnou&#x201C;,\nale m&#x16F;&#x17E;e&#x161; se &#x201E;do n&#x11B;j&#x201C; pod&#xED;vat p&#x159;eveden&#xED;m na seznam.\nUvid&#xED;&#x161; tak seznam dvojic (&#x10D;&#xED;slo, trpasl&#xED;k):</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">trpaslici</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;enumerate object at 0x7f0db61b29d8&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">trpaslici</span><span class=\"p\">))</span>\n<span class=\"go\">[(0, &apos;Pr&#xF3;fa&apos;), (1, &apos;Stydl&#xED;n&apos;), (2, &apos;D&#x159;&#xED;mal&apos;), (3, &apos;Kejchal&apos;), (4, &apos;&#x160;t&#xED;stko&apos;), (5, &apos;&#x160;mudla&apos;), (6, &apos;Rejpal&apos;)]</span>\n</pre></div><p>M&#xED;sto p&#x159;eveden&#xED; na seznam m&#x16F;&#x17E;e&#x161; p&#x159;es objekt <code>enumerate</code> iterovat cyklem <code>for</code>\na pro ka&#x17E;dou dvojici n&#x11B;co ud&#x11B;lat.\nT&#x159;eba ji hezky vypsat:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">for</span> <span class=\"n\">dvojice</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">trpaslici</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Rozbalen&#xED; dvojice</span>\n    <span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">trpaslik</span> <span class=\"o\">=</span> <span class=\"n\">dvojice</span>\n    <span class=\"c1\"># Vyps&#xE1;n&#xED;</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s1\">&apos;Na pozici {index} je {trpaslik}!&apos;</span><span class=\"p\">)</span>\n</pre></div><p>Objekt, kter&#xFD; funkce <code>enumerate</code> vrac&#xED;, je <em>iter&#xE1;tor dvojic</em> &#x2013; sekvence,\njej&#xED;&#x17E; prvky jsou dvojice.</p>\n<h2>Rozbalov&#xE1;n&#xED; v cyklu for</h2>\n<p>&#x201E;Trpasli&#x10D;&#xED;&#x201C; cyklus se d&#xE1; rozepsat takto:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">dvojice</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"s1\">&apos;Pr&#xF3;fa&apos;</span>    <span class=\"c1\"># toto d&#x11B;l&#xE1; `for`</span>\n<span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">trpaslik</span> <span class=\"o\">=</span> <span class=\"n\">dvojice</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s1\">&apos;Na pozici {index} je {trpaslik}!&apos;</span><span class=\"p\">)</span>\n\n<span class=\"n\">dvojice</span> <span class=\"o\">=</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s1\">&apos;Stydl&#xED;n&apos;</span>  <span class=\"c1\"># toto d&#x11B;l&#xE1; `for`</span>\n<span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">trpaslik</span> <span class=\"o\">=</span> <span class=\"n\">dvojice</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s1\">&apos;Na pozici {index} je {trpaslik}!&apos;</span><span class=\"p\">)</span>\n\n<span class=\"n\">dvojice</span> <span class=\"o\">=</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"s1\">&apos;D&#x159;&#xED;mal&apos;</span>  <span class=\"c1\"># toto d&#x11B;l&#xE1; `for`</span>\n<span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">trpaslik</span> <span class=\"o\">=</span> <span class=\"n\">dvojice</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s1\">&apos;Na pozici {index} je {trpaslik}!&apos;</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># A tak d&#xE1;le</span>\n</pre></div><p>Kdybys to psala ru&#x10D;n&#x11B;, lze to zjednodu&#x161;it &#x2013; p&#x159;i&#x159;adit do dvou prom&#x11B;nn&#xFD;ch\nnajedno, bez pomocn&#xE9; <code>dvojice</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">trpaslik</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"s1\">&apos;Pr&#xF3;fa&apos;</span>    <span class=\"c1\"># toto by mohl d&#x11B;lat `for`</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s1\">&apos;Na pozici {index} je {trpaslik}!&apos;</span><span class=\"p\">)</span>\n\n<span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">trpaslik</span> <span class=\"o\">=</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s1\">&apos;Stydl&#xED;n&apos;</span>  <span class=\"c1\"># toto by mohl d&#x11B;lat `for`</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s1\">&apos;Na pozici {index} je {trpaslik}!&apos;</span><span class=\"p\">)</span>\n\n<span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">trpaslik</span> <span class=\"o\">=</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"s1\">&apos;D&#x159;&#xED;mal&apos;</span>  <span class=\"c1\"># toto by mohl d&#x11B;lat `for`</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s1\">&apos;Na pozici {index} je {trpaslik}!&apos;</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># A tak d&#xE1;le</span>\n</pre></div><p>A <code>for</code> tohle ve skute&#x10D;nosti um&#xED;: m&#xED;sto do prom&#x11B;nn&#xE9; <code>dvojice</code> m&#x16F;&#x17E;e p&#x159;i&#x159;adit\nrovnou do dvou prom&#x11B;nn&#xFD;ch <code>index, trpaslik</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">for</span> <span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">trpaslik</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">trpaslici</span><span class=\"p\">):</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s1\">&apos;Na pozici {index} je {trpaslik}!&apos;</span><span class=\"p\">)</span>\n</pre></div><p>Tohle je docela &#x10D;ast&#x1E99; zp&#x16F;sob pr&#xE1;ce s&#xA0;<em>iter&#xE1;torem n-tic</em> &#x2013; m&#xE1;&#x161;-li sekvenci,\njej&#xED;&#x17E; prvky jsou <var>n</var>-tice, m&#x16F;&#x17E;e&#x161; jednotliv&#xE9; sou&#x10D;&#xE1;sti <var>n</var>-tice\nrozbalit p&#x159;&#xED;mo v&#xA0;hlavi&#x10D;ce <code>for</code> cyklu.</p>\n<p>Zkus si to! Zkop&#xED;ruj si tento seznam:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">dny</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&apos;Po&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;&#xDA;t&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;St&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;&#x10C;t&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;P&#xE1;&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;So&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;Ne&apos;</span><span class=\"p\">]</span>\n</pre></div><p>&#x2026; a zkus vypsat:</p>\n<div class=\"highlight\"><pre><code>1. Po\n2. &#xDA;t\n3. St\n4. &#x10C;t\n5. P&#xE1;\n6. So\n7. Ne</code></pre></div><div class=\"solution\" id=\"solution-0\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2019/brno-jaro-2019-pondeli/beginners/zip-enumerate/index/solutions/0/\"><span class=\"link-text\">Uk&#xE1;zat &#x159;e&#x161;en&#xED;</span></a>\n    </div>\n    <div class=\"solution-body\" aria-hidden=\"true\">\n        <div class=\"highlight\"><pre><span></span><span class=\"n\">dny</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&apos;Po&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;&#xDA;t&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;St&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;&#x10C;t&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;P&#xE1;&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;So&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;Ne&apos;</span><span class=\"p\">]</span>\n<span class=\"k\">for</span> <span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">den</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">dny</span><span class=\"p\">):</span>\n    <span class=\"n\">cislo</span> <span class=\"o\">=</span> <span class=\"n\">index</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s1\">&apos;{cislo}. {den}&apos;</span><span class=\"p\">)</span>\n</pre></div><p>To je tro&#x161;ku kostrbat&#xE9;, ale d&#xE1; se to zjednodu&#x161;it: funkce <code>enumerate</code> zn&#xE1;\npojmenovan&#xFD; argument <code>start</code>, pomoc&#xED; kter&#xE9;ho um&#xED; sama\npo&#x10D;&#xED;tat od jin&#xE9;ho za&#x10D;&#xE1;tku ne&#x17E; od nuly:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">dny</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&apos;Po&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;&#xDA;t&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;St&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;&#x10C;t&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;P&#xE1;&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;So&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;Ne&apos;</span><span class=\"p\">]</span>\n<span class=\"k\">for</span> <span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">den</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">dny</span><span class=\"p\">,</span> <span class=\"n\">start</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">):</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s1\">&apos;{index}. {den}&apos;</span><span class=\"p\">)</span>\n</pre></div>\n    </div>\n</div><h2>Zip: V&#xED;c iterac&#xED; najednou</h2>\n<p>Dal&#x161;&#xED; iter&#xE1;tor <var>n</var>-tic je funkce <code>zip</code>, kter&#xE1; um&#xED; proj&#xED;t dv&#x11B; sekvence\nnar&#xE1;z.\n&#x158;ekn&#x11B;me &#x17E;e m&#xE1;&#x161; seznam v&#x11B;c&#xED; a k&#xA0;nim p&#x159;&#xED;slu&#x161;n&#xFD;ch barev:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">veci</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&apos;tr&#xE1;va&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;slunce&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;mrkev&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;&#x159;eka&apos;</span><span class=\"p\">]</span>\n<span class=\"n\">barvy</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&apos;zelen&#xE1;&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;&#x17E;lut&#xE9;&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;oran&#x17E;ov&#xE1;&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;modr&#xE1;&apos;</span><span class=\"p\">]</span>\n</pre></div><p>Kdty&#x17E; tyto dva seznamy d&#xE1;&#x161; funkci <code>zip</code>, dostane&#x161; iter&#xE1;tor kter&#xFD; p&#x159;&#xED;slu&#x161;n&#xE9;\nhodnoty sp&#xE1;ruje.\nBude tedy obsahovat:</p>\n<ul>\n<li>Dvojici prvn&#xED;ch prvk&#x16F; obou seznam&#x16F;</li>\n<li>Dvojici druh&#xFD;ch prvk&#x16F; obou seznam&#x16F;</li>\n<li>Dvojici t&#x159;et&#xED;ch prvk&#x16F; obou seznam&#x16F;</li>\n<li>...</li>\n</ul>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">for</span> <span class=\"n\">vec</span><span class=\"p\">,</span> <span class=\"n\">barva</span> <span class=\"ow\">in</span> <span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">veci</span><span class=\"p\">,</span> <span class=\"n\">barvy</span><span class=\"p\">):</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s2\">&quot;{vec} je {barva}&quot;</span><span class=\"p\">)</span>\n</pre></div><p>Funguje to i pro v&#xED;ce sekvenc&#xED;.\nV&#xA0;n&#xE1;sleduj&#xED;c&#xED;m p&#x159;&#xED;pad&#x11B; je v&#xFD;sledn&#xFD; <code>zip</code> iter&#xE1;tor &#x10D;tve&#x159;ic (v&#x11B;c, barva,\nm&#xED;sto, &#x10D;&#xED;slo):</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">veci</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&apos;tr&#xE1;va&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;slunce&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;mrkev&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;&#x159;eka&apos;</span><span class=\"p\">]</span>\n<span class=\"n\">barvy</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&apos;zelen&#xE1;&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;&#x17E;lut&#xE9;&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;oran&#x17E;ov&#xE1;&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;modr&#xE1;&apos;</span><span class=\"p\">]</span>\n<span class=\"n\">mista</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&apos;na zemi&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;naho&#x159;e&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;na tal&#xED;&#x159;i&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;za z&#xED;dkou&apos;</span><span class=\"p\">]</span>\n<span class=\"n\">cisla</span> <span class=\"o\">=</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">4</span><span class=\"p\">)</span>\n\n<span class=\"k\">for</span> <span class=\"n\">vec</span><span class=\"p\">,</span> <span class=\"n\">barva</span><span class=\"p\">,</span> <span class=\"n\">misto</span><span class=\"p\">,</span> <span class=\"n\">cislo</span> <span class=\"ow\">in</span> <span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">veci</span><span class=\"p\">,</span> <span class=\"n\">barvy</span><span class=\"p\">,</span> <span class=\"n\">mista</span><span class=\"p\">,</span> <span class=\"n\">cisla</span><span class=\"p\">):</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s2\">&quot;{cislo}. {barva} {vec} je {misto}&quot;</span><span class=\"p\">)</span>\n</pre></div><p>Kdy&#x17E; si ale vyp&#xED;&#x161;e&#x161; samotn&#xFD; objekt <code>zip</code>, zjist&#xED;&#x161; &#x17E;e o sob&#x11B; nic moc ne&#x159;ekne\n&#x2013; podobn&#x11B; jako <code>enumerate</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">veci</span><span class=\"p\">,</span> <span class=\"n\">barvy</span><span class=\"p\">,</span> <span class=\"n\">mista</span><span class=\"p\">,</span> <span class=\"n\">cisla</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;zip object at 0x7f0db61b1f48&gt;</span>\n</pre></div><h2>Zip Longest: Pro ty co cht&#x11B;j&#xED; v&#x161;echno</h2>\n<p>Jak se <code>zip</code> chov&#xE1;, kdy&#x17E; dostane seznamy r&#x16F;zn&#xFD;ch d&#xE9;lek?</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">veci</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&apos;tr&#xE1;va&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;slunce&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;mrkev&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;&#x159;eka&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;my&#x161;lenka&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;spravedlnost&apos;</span><span class=\"p\">]</span>\n<span class=\"n\">barvy</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&apos;zelen&#xE1;&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;&#x17E;lut&#xE9;&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;oran&#x17E;ov&#xE1;&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;modr&#xE1;&apos;</span><span class=\"p\">]</span>\n<span class=\"k\">for</span> <span class=\"n\">vec</span><span class=\"p\">,</span> <span class=\"n\">barva</span> <span class=\"ow\">in</span> <span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">veci</span><span class=\"p\">,</span> <span class=\"n\">barvy</span><span class=\"p\">):</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s2\">&quot;{vec} je {barva}&quot;</span><span class=\"p\">)</span>\n</pre></div><div class=\"solution\" id=\"solution-1\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2019/brno-jaro-2019-pondeli/beginners/zip-enumerate/index/solutions/1/\"><span class=\"link-text\">Uk&#xE1;zat &#x159;e&#x161;en&#xED;</span></a>\n    </div>\n    <div class=\"solution-body\" aria-hidden=\"true\">\n        <p>V&#xFD;sledek <code>zip</code> skon&#x10D;&#xED; hned kdy&#x17E; &#x201E;dojde&#x201C; nejkrat&#x161;&#xED; sekvence.</p>\n    </div>\n</div><p>Ob&#x10D;as je pot&#x159;eba proj&#xED;t v&#x161;echny z&#xE1;znamy.\nNa to slou&#x17E;&#xED; funkce <code>zip_longest</code> z&#xA0;modulu <code>itertools</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">itertools</span> <span class=\"kn\">import</span> <span class=\"n\">zip_longest</span>\n<span class=\"k\">for</span> <span class=\"n\">vec</span><span class=\"p\">,</span> <span class=\"n\">barva</span> <span class=\"ow\">in</span> <span class=\"n\">zip_longest</span><span class=\"p\">(</span><span class=\"n\">veci</span><span class=\"p\">,</span> <span class=\"n\">barvy</span><span class=\"p\">,</span> <span class=\"n\">fillvalue</span><span class=\"o\">=</span><span class=\"s1\">&apos;(nev&#xED;m)&apos;</span><span class=\"p\">):</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s2\">&quot;{vec} je {barva}&quot;</span><span class=\"p\">)</span>\n</pre></div><p>Argument <code>fillvalue</code> &#x159;&#xED;k&#xE1;, co se dopln&#xED; za chyb&#x11B;j&#xED;c&#xED; hodnoty.\nKdy&#x17E; ho nezad&#xE1;&#x161;, dopln&#xED; se <code>None</code> (&#x201E;nic&#x201C;, hodnota kterou nap&#x159;. vrac&#xED; procedury).\nTo se &#x10D;asto pou&#x17E;&#xED;v&#xE1;, kdy&#x17E; je pro chyb&#x11B;j&#xED;c&#xED; hodnoty pot&#x159;eba n&#x11B;jak&#xE1;\nslo&#x17E;it&#x11B;j&#x161;&#xED; logika:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">itertools</span> <span class=\"kn\">import</span> <span class=\"n\">zip_longest</span>\n<span class=\"k\">for</span> <span class=\"n\">vec</span><span class=\"p\">,</span> <span class=\"n\">barva</span> <span class=\"ow\">in</span> <span class=\"n\">zip_longest</span><span class=\"p\">(</span><span class=\"n\">veci</span><span class=\"p\">,</span> <span class=\"n\">barvy</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">vec</span> <span class=\"o\">==</span> <span class=\"bp\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">vec</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;n&#x11B;jak&#xE1; v&#x11B;c&apos;</span>\n    <span class=\"k\">if</span> <span class=\"n\">barva</span> <span class=\"o\">==</span> <span class=\"bp\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">barva</span> <span class=\"o\">=</span> <span class=\"s1\">&apos;bez barvy&apos;</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"s2\">&quot;{vec} je {barva}&quot;</span><span class=\"p\">)</span>\n</pre></div>\n\n\n        "
    }
  }
}