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