-
Notifications
You must be signed in to change notification settings - Fork 0
/
zip_longest_iter.py
34 lines (26 loc) · 1.22 KB
/
zip_longest_iter.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# *функция merge_longer_iter(iterables*, fill)
# возвращает итератор из кортежей элементов передаваемых iterable-объектов,
# объединенных по позиции (сначала первые из первых, вторые из вторых и тд).
# Итератор выдает кортежи, пока не закончится самый длинный iterable.
# Если один из них заканчивается, то вместо его элементов вставляется fill
from itertools import chain, repeat
class ZipExhausted(Exception):
pass
def izip_longest(*args, **kwds):
# izip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
fillvalue = kwds.get('fillvalue')
counter = [len(args) - 1]
def sentinel():
if not counter[0]:
raise ZipExhausted
counter[0] -= 1
yield fillvalue
fillers = repeat(fillvalue)
iterators = [chain(it, sentinel(), fillers) for it in args]
try:
while iterators:
yield tuple(map(next, iterators))
except ZipExhausted:
pass
for i in izip_longest([1, 4, 7], [2, 5, 8, 9, 10], [3, 6], fillvalue='-'):
print(i)