繁体   English   中英

Python在for循环的每次迭代中为范围函数生成随机步骤

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM