嵌套 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]
在执行嵌套 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]