用法
创建一个迭代器,它可以聚集来自每个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