【发布时间】:2016-04-16 09:33:14
【问题描述】:
我想循环遍历迭代器的“切片”。我不确定这是否可行,因为我知道不可能对迭代器进行切片。我想做的是:
def f():
for i in range(100):
yield(i)
x = f()
for i in x[95:]:
print(i)
这当然失败了:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-37-15f166d16ed2> in <module>()
4 x = f()
5
----> 6 for i in x[95:]:
7 print(i)
TypeError: 'generator' object is not subscriptable
有没有一种 Python 的方式来循环遍历生成器的“切片”?
基本上我真正关心的生成器读取一个非常大的文件并逐行对其执行一些操作。我想测试文件的切片以确保事情按预期执行,但是让它在整个文件上运行非常耗时。
编辑:
如前所述,我需要在文件上进行此操作。我希望有一种方法可以通过生成器明确指定这一点:
import skbio
f = 'seqs.fna'
seqs = skbio.io.read(f, format='fasta')
seqs 是一个生成器对象
for seq in itertools.islice(seqs, 30516420, 30516432):
#do a bunch of stuff here
pass
上面的代码做了我需要的,但是仍然很慢,因为生成器仍然循环遍历所有的行。我希望只循环指定的切片
【问题讨论】:
-
我不明白您的问题...如果您的生成器将文件作为输入,然后对其进行测试,将其传递给该文件的切片,您为什么要“切片生成器” ?
-
你看过
itertools.islice吗? -
请注意,
islice-ing 生成器不会阻止它在您关心和处理它们之前通过线路。最好为它提供文件的islice。 (您仍然需要阅读文件以查找换行符,但您将跳过生成器对不需要的行执行的任何处理。)
标签: python for-loop generator slice