Python对迭代器切片的方法itertools.islice()
我们知道不能直接对迭代器切片:```pythonaiter = (x for x in range(5))print(aiter[0:3])```输出:
·
我们知道不能直接对生成器或迭代器切片:
aiter = (x for x in range(5))
print(aiter[0:3])
输出:
TypeError: 'generator' object is not subscriptable
好在Python内置的itertools库通过了islice()方法用于迭代器的切片,基本语法如下:
islice(iterable, stop) --> islice object
islice(iterable, start, stop[, step]) --> islice object
只传入一个值时默认是从开头到该下标前为止:
import itertools
aiter = (x for x in range(5))
print(list(itertools.islice(aiter, 3)))
输出:
[0, 1, 2]
如果想完整地切片则可以写None(迭代器不能用len取长度):
import itertools
aiter = (x for x in range(5))
print(list(itertools.islice(aiter, None)))
输出:
[0, 1, 2, 3, 4]
传入3个参数可以像普通切片一样指定起始、结束和步长,其中步长是可选参数:
import itertools
aiter = (x for x in range(5))
print(list(itertools.islice(aiter, 1, 4, 2)))
输出:
[1, 3]
迭代器切片后就相当于被用过了,因此next会从切片之后的元素开始返回(即使切片之前还有元素也不要了):
import itertools
aiter = (x for x in range(5))
print(list(itertools.islice(aiter, 1, 3)))
print(next(aiter))
输出:
[1, 2]
3
即使切片之前还有一个0,也取不到了,毕竟迭代器是单向的。
和普通切片一样,islice是浅拷贝:
import itertools
values = [1, 2, [1, 2]]
new = list(itertools.islice(values, None))
values[-1][0] = 3
print(new)
输出:
[1, 2, [3, 2]]
更多推荐
已为社区贡献4条内容
所有评论(0)