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

Nested for loops - getting the right order

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

我有一个整数列表:

[7, 9, 12]

还有一个包含多行 DNA 序列数据的 .txt。

>Ind1 AACTCAGCTCACG
>Ind2 GTCATCGCTACGA 
>Ind3 CTTCAAACTGACT

我正在尝试制作一个嵌套的 for 循环,它采用第一个整数 (7),遍历文本行并在每行的位置 7 处打印字符。然后获取下一个整数,并在每行的位置 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

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

------编辑--------

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

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

正在尝试回答:

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))

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

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

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