Commit 6f45d18c authored by Raymond Hettinger's avatar Raymond Hettinger

Improve itertools docs with clearer examples of pure python equivalent code.

parent e584457e
...@@ -1367,10 +1367,10 @@ are always available. They are listed here in alphabetical order. ...@@ -1367,10 +1367,10 @@ are always available. They are listed here in alphabetical order.
def zip(*iterables): def zip(*iterables):
# zip('ABCD', 'xy') --> Ax By # zip('ABCD', 'xy') --> Ax By
sentinel = object() sentinel = object()
iterables = [iter(it) for it in iterables] iterators = [iter(it) for it in iterables]
while iterables: while iterators:
result = [] result = []
for it in iterables: for it in iterators:
elem = next(it, sentinel) elem = next(it, sentinel)
if elem is sentinel: if elem is sentinel:
return return
......
...@@ -557,16 +557,25 @@ loops that truncate the stream. ...@@ -557,16 +557,25 @@ loops that truncate the stream.
iterables are of uneven length, missing values are filled-in with *fillvalue*. iterables are of uneven length, missing values are filled-in with *fillvalue*.
Iteration continues until the longest iterable is exhausted. Equivalent to:: Iteration continues until the longest iterable is exhausted. Equivalent to::
def zip_longest(*args, fillvalue=None): class ZipExhausted(Exception):
pass
def zip_longest(*args, **kwds):
# zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D- # zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
def sentinel(counter = ([fillvalue]*(len(args)-1)).pop): fillvalue = kwds.get('fillvalue')
yield counter() # yields the fillvalue, or raises IndexError counter = len(args) - 1
def sentinel():
nonlocal counter
if not counter:
raise ZipExhausted
counter -= 1
yield fillvalue
fillers = repeat(fillvalue) fillers = repeat(fillvalue)
iters = [chain(it, sentinel(), fillers) for it in args] iterators = [chain(it, sentinel(), fillers) for it in args]
try: try:
for tup in zip(*iters): while iterators:
yield tup yield tuple(map(next, iterators))
except IndexError: except ZipExhausted:
pass pass
If one of the iterables is potentially infinite, then the :func:`zip_longest` If one of the iterables is potentially infinite, then the :func:`zip_longest`
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment