, @nneonneo , . , , itertools. :
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return itertools.izip_longest(fillvalue=fillvalue, *args)
, "" None , , . , :
def grouper2(iterable, n):
iterable = iter(iterable)
while True:
tup = tuple(itertools.islice(iterable, 0, n))
if tup:
yield tup
else:
break
. , , , , , ...
"" , , - . , 2 , . , , !
, , , - "" islice, , - . - , StopIteration, , . , itertools.chain:
def grouper3(iterable, n):
iterable = iter(iterable)
while True:
group = itertools.islice(iterable, n)
item = next(group)
yield itertools.chain((item,), group)
, , , . , , . list(grouper3(..., n)), "m" , 1 , n ( "m" - "" ). , . , itutools "" ( collections itertools):
def grouper4(iterable, n):
iterable = iter(iterable)
group = []
while True:
collections.deque(group, maxlen=0) # consume all of the last group
group = itertools.islice(iterable, n)
item = next(group) # raises StopIteration if the group doesn't yield anything
group = itertools.chain((item,), group)
yield group
, list(grouper4(..., n)) . , , next (, for ) .