Python 用islice()选取子集,前面使用了切片符号从集合中选取子集,当时是将一个列表对象中的元素组对。例如对于下面这个简单的列表:
flat = ['2', '3', '5', '7', '11', '13', '17', '19',
'23', '29', '31', '37', '41', '43', '47', '53',
'59', '61', '67', '71',
...
]
可以通过列表切片创建数据对:
>>> list(zip(flat[0::2], flat[1::2]))
[(2, 3), (5, 7), (11, 13), ...]
借助islice()
函数则无须实例化列表对象就能实现相同的功能,处理任意大小的可迭代对象,如下所示:
flat_iter_1 = iter(flat)
flat_iter_2 = iter(flat)
zip(
islice(flat_iter_1, 0, None, 2),
islice(flat_iter_2, 1, None, 2)
)
这里基于一维数据点列表创建了两个独立的迭代器,它们可能是遍历打开的文件或者数据库结果集的两个迭代器。两个迭代器必须彼此独立,以保证一个
islice()
函数的变动不会影响另一个islice()
函数。
islice()
函数的两组输入参数与flat[0::2]
和flat[1::2]
表达式类似。由于没有切片符号式的简写形式,必须指明起始参数和结束参数,步长值可以省略,而取默认值1。上面的代码返回由二元组组成的数据序列:
[(2, 3), (5, 7), (11, 13), (17, 19), (23, 29),
...
(7883, 7901), (7907, 7919)]
由于islice()
函数返回迭代器,所以可用于处理巨大的数据集,例如从一个大型数据集中提取一个子集。除了使用filter()
函数和compress()
函数,还可以用islice(source, 0, None, c)
从大型数据集中提取 \frac{1}{c} 个数据项。