Python 内建函数 - zip(*iterables)

用法

创建一个迭代器,它可以聚集来自每个iterables的元素。

返回的是元组的迭代器,其第i项元组包含了i个来自每个参数序列或迭代的元素,当用尽输入最短的迭代时迭代器停止。单参数下,它返回一个1次元组迭代器;无参数时,它返回一个空迭代,等于:

def zip(*iterables):
    # zip('ABCD', 'xy') --> Ax By
    sentinel = object()
    iterators = [iter(it) for it in iterables]
    while iterators:
        result = []
        for it in iterators:
            elem = next(it, sentinel)
            if elem is sentinel:
                return
            result.append(elem)
        yield tuple(result)

迭代复制顺序必定是从左到右的规则。这使得用zip(*[iter(s)]*n)将长度为n的数据组进行数据序列聚集成为可能;并且,根据规则来重复相同的迭代器n次,以便每个输出元组都有n个迭代器调用的结果;在将输入划分为长度是n的块时,这项规则同样具有影响。

当你不在意更长的iterables的尾部或不匹配的值时,zip()是处理不等长输入的最好选择。如果这些值都很重要,你也可以使用itertools.zip_longest()

zip()结合 * 运算符可以用于解压列表:

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

拓展阅读

itertools.zip_longest()


版权声明:本文为powerdoom原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。