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