我正在尝试将字符串拆分为随机大小的小块。例如,
string = 'qwertyuiopp'
加入['qw','e','rty,'u','iopp']
for record in SeqIO.parse(args.fasta_file , "fasta"):
step = 200
for i in range(0, len(record),step):
oline = ">"+record.id+"_"+str(i+1)+"\n"
ofname.write(oline)
step = random.randrange(200,2000)
if len(record.seq[i:i+step]) >= 200:
oline= str(record.seq[i:i+step])+"\n"
ofname.write(oline)
i=i+step
else:
oline= str(record.seq[i-200:])+"\n"
ofname.write(oline)
i=len(record)+1
我认为问题在于范围函数中的步长保持不变(200),尽管使用randrange修改步骤的值。但我不知道应该怎么做。感谢您的帮助。
答案 0 :(得分:4)
range
函数就会创建一个列表。它不会针对每次迭代进行评估。
您可以使用while
循环来实现此目的。
import random
step = 1
count = 0
while count < len(record):
print count
step = random.randint(1, 5)
count += step
答案 1 :(得分:2)
range
函数不记得它是如何获得它的构造值的。当您调用创建范围对象range(0, len(record), step)
(Python 3.x)或列表range(0, 1000, 200)
(Python 2.x)的[0, 200, 400, 600, 800]
时。无论哪种方式,稍后更改step
都不会改变任何内容。
您可以构建一个自定义迭代器,让您重置其步骤,或者更改其步骤并迭代(start, end)
或(start, step)
对的自定义迭代器。但对你来说这可能有点先进。*
在这种情况下,当您无法找到或编写迭代器进行循环时,您必须转到while
循环,并手动更新循环变量。
值得注意的是,您已经尝试使用i = i + step
手动更新循环变量。这在for
循环中通常是一个坏主意 - 但在while
循环内,它正是你想要的。所以,真的,只需改变这一行:
for i in range(0, len(record),step):
......对这两行:
i = 0
while i < len(record):
您的代码中还有其他问题需要修复(包括至少两个IndentationError
s),但是一旦超过这个问题就可以修复它们。
最后一件事:无论你有for
循环还是while
循环,如果你想早点爆发,那么这样做的方法是break
语句,不是试图改变循环条件,所以下一个测试将失败。因此,最后也将i=len(record)+1
替换为break
。
*此外,这种迭代器的明显实现仍然是同一种while
循环......