Kaydet (Commit) 5d12faa5 authored tarafından Raymond Hettinger's avatar Raymond Hettinger

Merge

......@@ -1375,10 +1375,10 @@ are always available. They are listed here in alphabetical order.
def zip(*iterables):
# zip('ABCD', 'xy') --> Ax By
sentinel = object()
iterables = [iter(it) for it in iterables]
while iterables:
iterators = [iter(it) for it in iterables]
while iterators:
result = []
for it in iterables:
for it in iterators:
elem = next(it, sentinel)
if elem is sentinel:
return
......
......@@ -595,16 +595,25 @@ loops that truncate the stream.
iterables are of uneven length, missing values are filled-in with *fillvalue*.
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-
def sentinel(counter = ([fillvalue]*(len(args)-1)).pop):
yield counter() # yields the fillvalue, or raises IndexError
fillvalue = kwds.get('fillvalue')
counter = len(args) - 1
def sentinel():
nonlocal counter
if not counter:
raise ZipExhausted
counter -= 1
yield fillvalue
fillers = repeat(fillvalue)
iters = [chain(it, sentinel(), fillers) for it in args]
iterators = [chain(it, sentinel(), fillers) for it in args]
try:
for tup in zip(*iters):
yield tup
except IndexError:
while iterators:
yield tuple(map(next, iterators))
except ZipExhausted:
pass
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