当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python zip用法及代码示例


用法:

zip(*iterables, strict=False)

并行迭代几个可迭代对象,生成元组,每个对象都有一个项目。

例子:

>>> for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']):
...     print(item)
...
(1, 'sugar')
(2, 'spice')
(3, 'everything nice')

更正式地说:zip() 返回元组的迭代器,其中 i -th 元组包含来自每个参数迭代的 i -th 元素。

zip() 的另一种理解方式是将行转换为列,将列转换为行。这类似于 transposing a matrix

zip() 是惰性的:在迭代迭代之前不会处理元素,例如通过 for 循环或包装在 list 中。

需要考虑的一件事是传递给zip() 的迭代可能有不同的长度;有时是设计使然,有时是因为准备这些迭代的代码中的错误。 Python 提供了三种不同的方法来处理这个问题:

  • 默认情况下,zip() 在最短的迭代用完时停止。它将忽略较长迭代中的剩余项,将结果截断为最短迭代的长度:

    >>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum']))
    [(0, 'fee'), (1, 'fi'), (2, 'fo')]
  • zip() 通常用于假设可迭代的长度相等的情况。在这种情况下,建议使用strict=True 选项。它的输出与常规 zip() 相同:

    >>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True))
    [('a', 1), ('b', 2), ('c', 3)]

    与默认行为不同,它检查可迭代对象的长度是否相同,如果不是,则引发 ValueError

    >>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True))
    Traceback (most recent call last):
      ...
    ValueError: zip() argument 2 is longer than argument 1

    如果没有strict=True 参数,任何导致不同长度的迭代的错误都将被静音,可能表现为程序另一部分中难以发现的错误。

  • 较短的可迭代对象可以用一个常数值填充,以使所有可迭代对象具有相同的长度。这是由 itertools.zip_longest() 完成的。

边情况:使用单个可迭代参数,zip() 返回 1 元组的迭代器。没有参数,它返回一个空的迭代器。

技巧和窍门:

  • 保证迭代的从左到右的评估顺序。这使得使用 zip(*[iter(s)]*n, strict=True) 将数据系列聚类到 n-length 组中成为可能。这将重复 same 迭代器 n 次,以便每个输出元组都具有对迭代器的 n 调用的结果。这具有将输入划分为n-length 块的效果。

  • zip()* 运算符一起可用于解压缩列表:

    >>> x = [1, 2, 3]
    >>> y = [4, 5, 6]
    >>> list(zip(x, y))
    [(1, 4), (2, 5), (3, 6)]
    >>> x2, y2 = zip(*zip(x, y))
    >>> x == list(x2) and y == list(y2)
    True

在 3.10 版中更改:添加了strict争论。

相关用法


注:本文由纯净天空筛选整理自python.org大神的英文原创作品 zip。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。