嵌套for循环 - 获得正确的顺序

时间:2015-04-20 09:45:50

标签: python for-loop nested indentation

在执行嵌套for循环时,我无法掌握如何正确输出正确的顺序。

我有一个整数列表:

[7, 9, 12]

带有DNA序列数据的.txt。

>Ind1 AACTCAGCTCACG
>Ind2 GTCATCGCTACGA 
>Ind3 CTTCAAACTGACT

我正在尝试创建一个嵌套的for循环,它接受第一个整数(7),遍历文本行并在每个行的7位打印charachter。然后获取下一个整数,并在每个行的第9位打印每个字符。

with (Input) as getletter:
    for line in getletter:
        if line [0] == ">":

            for pos in position:
                snp = line[pos]
                print line[pos], str(pos)

当我运行上面的代码时,我得到了我想要的数据,但顺序错误,如下:

A  7
T  9
G  12
T  7
A  9
G  12
T  7
C  9
A  12

我想要的是:

A  7
T  7
T  7
T  9
A  9
C  9
G  12
G  12
A  12

我怀疑可以通过更改代码的缩进来解决问题,但我无法正确理解。

------ -------- EDIT

我试图交换两个循环,但我显然没有得到更大的图片,这给了我与上面相同(错误)的结果。

with (Input) as getsnps:
    for line in getsnps:
        if line[0] == ">":
            hit = line
        for pos in position:
                print hit[pos], pos

1 个答案:

答案 0 :(得分:1)

尝试回答:

with (Input) as getletter:
    lines=[x.strip() for x in getLetter.readlines() if x.startswith('>') ]
    for pos in position:
        for line in lines:
            snp = line[pos]
            print ("%s\t%s" % (pos,snp))

将文件读取并缓存到一个数组中(行,丢弃文件不以>开头) 然后我们遍历位置然后遍历线并打印预期结果。

请注意,您应该检查您的偏移量是否大于您的线。

没有列表理解的替代方案(将使用更多内存,特别是如果你有很多无用的行(即不是以'>'开头)

with (Input) as getletter:       
    lines=getLetter.readlines()
    for pos in position:
        for line in lines:
            if line.startswith('>'):
                 snp = line[pos]
                 print ("%s\t%s" % (pos,snp))

替代另一个存储(假设位置很小而输入很大)

with (Input) as getletter:
    storage=dict()
    for p in positions:
        storage[p]=[]
    for line in getLetter:
        for p in positions:
            storage[p]+=[line[pos]]
for (k,v) in storage.iteritems():
    print ("%s -> %s" % (k, ",".join(v))

如果position包含的值大于line的大小,则使用line[p]将触发异常(IndexError)。你可以抓住它或测试它

try:
    a=line[pos]
except IndexError:
    a='X'

if pos>len(line):
   a='X'
else:
   a=line[pos]