我是python的新手,一般都是编程,我正在通过一个名为rosalind.info的网站学习python,这是一个旨在通过解决问题进行教学的网站。
我正在处理页面上的示例问题,但遇到了一些困难。我知道我的代码可能非常低效和繁琐,但我认为对于那些刚接触编程的人来说是可以预期的。
无论如何,这是我的代码。
gc = open("rosalind_gcsamp.txt","r")
biz = gc.readlines()
i = 0
gcc = 0
d = {}
for i in xrange(biz.__len__()):
if biz[i].startswith(">"):
biz[i] = biz[i].replace("\n","")
biz[i+1] = biz[i+1].replace("\n","") + biz[i+2].replace("\n","")
del biz[i+2]
我想在这里完成的是,如下输入:
>Rosalind_6404 CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCC TCCCACTAATAATTCTGAGG
将基于行的列表中的内容分解并连接两行DNA,如下所示:
['>Rosalind_6404', 'CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCCTCCCACTAATAATTCTGAGG', 'TCCCACTAATAATTCTGAGG\n']
删除ID后面的两个索引,即> Rosalind。我以后用它做什么我还需要搞清楚。
然而,我一直得到一个索引错误,但在我的生命中,我找不到原因。我确定这是一个微不足道的原因,我只需要一些帮助。
我甚至尝试过以下方面取得了有限的成功:
for i in xrange(biz.__len__()):
if biz[i].startswith(">"):
biz[i] = biz[i].replace("\n","")
biz[i+1] = biz[i+1].replace("\n","") + biz[i+2].replace("\n","")
elif biz[i].startswith("A" or "C" or "G" or "T") and biz[i+1].startswith(">"):
del biz[i]
仍然给我一个索引错误,但至少给了我想要的商业价值。
提前致谢。
答案 0 :(得分:1)
你正在经历漫长的商业。因此,在您的上一次迭代中,biz[i+1]
和biz[i+2]
不存在。最后一个项目没有项目。
答案 1 :(得分:1)
itertools.groupby
使用以>
开头的行作为键和分隔符非常容易:
from itertools import groupby
with open("rosalind_gcsamp.txt","r") as gc:
# group elements using lines that start with ">" as the delimiter
groups = groupby(gc, key=lambda x: not x.startswith(">"))
d = {}
for k,v in groups:
# if k is False we a non match to our not x.startswith(">")
# so use the value v as the key and call next on the grouper object
# to get the next value
if not k:
key, val = list(v)[0].rstrip(), "".join(map(str.rstrip,next(groups)[1],""))
d[key] = val
print(d)
{'>Rosalind_0808': 'CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGACTGGGAACCTGCGGGCAGTAGGTGGAAT', '>Rosalind_5959': 'CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCAGGCGCTCCGCCGAAGGTCTATATCCATTTGTCAGCAGACACGC', '>Rosalind_6404': 'CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCCTCCCACTAATAATTCTGAGG'}
如果您需要订购,请使用collections.OrderedDict
代替d。