@@ -1720,50 +1720,90 @@ are always available. They are listed here in alphabetical order.
17201720 dictionary are ignored.
17211721
17221722
1723- .. function :: zip(*iterables)
1724-
1725- Make an iterator that aggregates elements from each of the iterables.
1726-
1727- Returns an iterator of tuples, where the *i *-th tuple contains
1728- the *i *-th element from each of the argument sequences or iterables. The
1729- iterator stops when the shortest input iterable is exhausted. With a single
1730- iterable argument, it returns an iterator of 1-tuples. With no arguments,
1731- it returns an empty iterator. Equivalent to::
1732-
1733- def zip(*iterables):
1734- # zip('ABCD', 'xy') --> Ax By
1735- sentinel = object()
1736- iterators = [iter(it) for it in iterables]
1737- while iterators:
1738- result = []
1739- for it in iterators:
1740- elem = next(it, sentinel)
1741- if elem is sentinel:
1742- return
1743- result.append(elem)
1744- yield tuple(result)
1745-
1746- The left-to-right evaluation order of the iterables is guaranteed. This
1747- makes possible an idiom for clustering a data series into n-length groups
1748- using ``zip(*[iter(s)]*n) ``. This repeats the *same * iterator ``n `` times
1749- so that each output tuple has the result of ``n `` calls to the iterator.
1750- This has the effect of dividing the input into n-length chunks.
1751-
1752- :func: `zip ` should only be used with unequal length inputs when you don't
1753- care about trailing, unmatched values from the longer iterables. If those
1754- values are important, use :func: `itertools.zip_longest ` instead.
1755-
1756- :func: `zip ` in conjunction with the ``* `` operator can be used to unzip a
1757- list::
1758-
1759- >>> x = [1, 2, 3]
1760- >>> y = [4, 5, 6]
1761- >>> zipped = zip(x, y)
1762- >>> list(zipped)
1763- [(1, 4), (2, 5), (3, 6)]
1764- >>> x2, y2 = zip(*zip(x, y))
1765- >>> x == list(x2) and y == list(y2)
1766- True
1723+ .. function :: zip(*iterables, strict=False)
1724+
1725+ Iterate over several iterables in parallel, producing tuples with an item
1726+ from each one.
1727+
1728+ Example::
1729+
1730+ >>> for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']):
1731+ ... print(item)
1732+ ...
1733+ (1, 'sugar')
1734+ (2, 'spice')
1735+ (3, 'everything nice')
1736+
1737+ More formally: :func: `zip ` returns an iterator of tuples, where the *i *-th
1738+ tuple contains the *i *-th element from each of the argument iterables.
1739+
1740+ Another way to think of :func: `zip ` is that it turns rows into columns, and
1741+ columns into rows. This is similar to `transposing a matrix
1742+ <https://en.wikipedia.org/wiki/Transpose> `_.
1743+
1744+ :func: `zip ` is lazy: The elements won't be processed until the iterable is
1745+ iterated on, e.g. by a :keyword: `!for ` loop or by wrapping in a
1746+ :class: `list `.
1747+
1748+ One thing to consider is that the iterables passed to :func: `zip ` could have
1749+ different lengths; sometimes by design, and sometimes because of a bug in
1750+ the code that prepared these iterables. Python offers three different
1751+ approaches to dealing with this issue:
1752+
1753+ * By default, :func: `zip ` stops when the shortest iterable is exhausted.
1754+ It will ignore the remaining items in the longer iterables, cutting off
1755+ the result to the length of the shortest iterable::
1756+
1757+ >>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum']))
1758+ [(0, 'fee'), (1, 'fi'), (2, 'fo')]
1759+
1760+ * :func: `zip ` is often used in cases where the iterables are assumed to be
1761+ of equal length. In such cases, it's recommended to use the ``strict=True ``
1762+ option. Its output is the same as regular :func: `zip `::
1763+
1764+ >>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True))
1765+ [('a', 1), ('b', 2), ('c', 3)]
1766+
1767+ Unlike the default behavior, it checks that the lengths of iterables are
1768+ identical, raising a :exc: `ValueError ` if they aren't:
1769+
1770+ >>> list (zip (range (3 ), [' fee' , ' fi' , ' fo' , ' fum' ], strict = True ))
1771+ Traceback (most recent call last):
1772+ ...
1773+ ValueError: zip() argument 2 is longer than argument 1
1774+
1775+ Without the ``strict=True `` argument, any bug that results in iterables of
1776+ different lengths will be silenced, possibly mainfesting as a hard-to-find
1777+ bug in another part of the program.
1778+
1779+ * Shorter iterables can be padded with a constant value to make all the
1780+ iterables have the same length. This is done by
1781+ :func: `itertools.zip_longest `.
1782+
1783+ Edge cases: With a single iterable argument, :func: `zip ` returns an
1784+ iterator of 1-tuples. With no arguments, it returns an empty iterator.
1785+
1786+ Tips and tricks:
1787+
1788+ * The left-to-right evaluation order of the iterables is guaranteed. This
1789+ makes possible an idiom for clustering a data series into n-length groups
1790+ using ``zip(*[iter(s)]*n, strict=True) ``. This repeats the *same * iterator
1791+ ``n `` times so that each output tuple has the result of ``n `` calls to the
1792+ iterator. This has the effect of dividing the input into n-length chunks.
1793+
1794+ * :func: `zip ` in conjunction with the ``* `` operator can be used to unzip a
1795+ list::
1796+
1797+ >>> x = [1, 2, 3]
1798+ >>> y = [4, 5, 6]
1799+ >>> list(zip(x, y))
1800+ [(1, 4), (2, 5), (3, 6)]
1801+ >>> x2, y2 = zip(*zip(x, y))
1802+ >>> x == list(x2) and y == list(y2)
1803+ True
1804+
1805+ .. versionchanged :: 3.10
1806+ Added the ``strict `` argument.
17671807
17681808
17691809.. function :: __import__(name, globals=None, locals=None, fromlist=(), level=0)
0 commit comments