Skip to content

Commit 38a829a

Browse files
committed
Add zip_longest
1 parent a5f91e2 commit 38a829a

1 file changed

Lines changed: 42 additions & 1 deletion

File tree

lessons/beginners/zip-enumerate/index.md

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ Funguje to i pro více sekvencí.
176176
V následujícím případě je výsledný `zip` iterátor čtveřic (věc, barva,
177177
místo, číslo):
178178

179-
``` python
179+
```python
180180
veci = ['tráva', 'slunce', 'mrkev', 'řeka']
181181
barvy = ['zelená', 'žluté', 'oranžová', 'modrá']
182182
mista = ['na zemi', 'nahoře', 'na talíři', 'za zídkou']
@@ -193,3 +193,44 @@ Když si ale vypíšeš samotný objekt `zip`, zjistíš že o sobě nic moc ne
193193
>>> zip(veci, barvy, mista, cisla)
194194
<zip object at 0x7f0db61b1f48>
195195
```
196+
197+
198+
## Zip Longest: Pro ty co chtějí všechno
199+
200+
Jak se `zip` chová, když dostane seznamy různých délek?
201+
202+
```python
203+
veci = ['tráva', 'slunce', 'mrkev', 'řeka', 'myšlenka', 'spravedlnost']
204+
barvy = ['zelená', 'žluté', 'oranžová', 'modrá']
205+
for vec, barva in zip(veci, barvy):
206+
print(f"{vec} je {barva}")
207+
```
208+
209+
{% filter solution %}
210+
Výsledek `zip` skončí hned když „dojde“ nejkratší sekvence.
211+
{% endfilter %}
212+
213+
Občas je potřeba projít všechny záznamy.
214+
Na to slouží funkce `zip_longest` z modulu `itertools`:
215+
216+
```python
217+
from itertools import zip_longest
218+
for vec, barva in zip_longest(veci, barvy, fillvalue='(nevím)'):
219+
print(f"{vec} je {barva}")
220+
```
221+
222+
Argument `fillvalue` říká, co se doplní za chybějící hodnoty.
223+
Když ho nezadáš, doplní se `None` („nic“, hodnota kterou např. vrací procedury).
224+
To se často používá, když je pro chybějící hodnoty potřeba nějaká
225+
složitější logika:
226+
227+
```python
228+
from itertools import zip_longest
229+
for vec, barva in zip_longest(veci, barvy):
230+
if vec == None:
231+
vec = 'nějaká věc'
232+
if barva == None:
233+
barva = 'bez barvy'
234+
print(f"{vec} je {barva}")
235+
```
236+

0 commit comments

Comments
 (0)