[英]Python generate random steps for range function in each iteration of a for loop
我正在尝试将字符串分成随机大小的小块。 例如,
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
我认为问题是,尽管使用randrange修改了step的值,但range函数中的step仍然保持常量(200)。 但我不知道该怎么做。 感谢您的帮助。
一旦遇到for循环, range
函数就会创建一个列表。 不会为每个迭代进行评估。 您可以为此使用while
循环。
import random
step = 1
count = 0
while count < len(record):
print count
step = random.randint(1, 5)
count += step
range
函数不记得它是如何获得其构造值的。 当您调用range(0, len(record), step)
创建范围对象range(0, 1000, 200)
(Python 3.x)或列表[0, 200, 400, 600, 800]
(Python 2.x)。 无论哪种方式,稍后更改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
),但是一旦您解决了这些问题,就可以修复它们。
最后一件事:无论您有for
循环还是while
循环,如果您想尽早爆发,执行此操作的方式是break
语句,而不是尝试更改循环条件,因此下一个测试将失败。 因此,也请在结尾处将i=len(record)+1
替换为break
。
*而且,这种迭代器的显而易见的实现方式还是是同一种while
循环……
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.