目录
12. zip()
zip()函数用于创建一个聚合多个可迭代对象的迭代器;
做法是将作为参数传入的每个可迭代对象的每个元素依次组合成元组,即第 i 个元组包含来自每个参数的第 i 个元素;
可通过list()、tuple()将enumerate()返回的迭代器转换为列表、元组;
支持列表、元组、字符串、range()等可迭代对象混合进行聚合,支持1个或多个可迭代对象聚合;
当多个可迭代对象元素数不一致时,以元素数最少的可迭代对象为准,取相应轮次元素组成迭代器;
可以使用itertools函数模块的itertools.zip_longest()函数,按元素数最多的可迭代对象组成迭代器,空出元素填充None。
#zip()函数用于创建一个聚合多个可迭代对象的迭代器;
zip([1,2,3],[4,5,6])
<zip object at 0x000002690CC9BB00>
list(zip([1,2,3],[4,5,6]))
[(1, 4), (2, 5), (3, 6)]
#支持列表、元组、字符串、range()等可迭代对象混合进行聚合,支持1个或多个可迭代对象聚合
list(zip([1,2,3]))
[(1,), (2,), (3,)]
tuple(zip([1,2,3],(4,5,6),'789',range(3)))
((1, 4, '7', 0), (2, 5, '8', 1), (3, 6, '9', 2))
#当多个可迭代对象元素数不一致时,以元素数最少的可迭代对象为准,取相应轮次元素组成迭代器
list(zip([1,2],(3,4,5),'6789'))
[(1, 3, '6'), (2, 4, '7')]
#可以使用itertools函数模块的itertools.zip_longest()函数,按元素数最多的可迭代对象组成迭代器,空出元素填充None
import itertools
list(itertools.zip_longest([1,2],(3,4,5),'6789'))
[(1, 3, '6'), (2, 4, '7'), (None, 5, '8'), (None, None, '9')]
12.1 zip(*[iter(s)]*n)
zip() 函数将确保可迭代对象按从左至右的顺序组合,通过 zip(*[iter(s)]*n) 的惯用形式,将同一个迭代器重复迭代 N 遍,实现将对象划分为 N 个长度块的效果;
当可迭代对象s长度不是N的整数倍时,多出部分丢弃。
举例如下:
问题:请使用一句代码,将 [1, 2, 3, 4, 5, 6, 7, 8, 9] 变成 [(1, 2, 3), (4, 5, 6), (7, 8, 9)]
>>> list(zip(*[iter([1, 2, 3, 4, 5, 6, 7, 8, 9])] * 3))
[(1, 2, 3), (4, 5, 6), (7