不断得到IndexError并且不确定为什么在Python中

时间:2015-04-27 16:31:59

标签: python indexing

我是python的新手,一般都是编程,我正在通过一个名为rosalind.info的网站学习python,这是一个旨在通过解决问题进行教学的网站。

Here is the problem, wherein you're asked to calculate the percentage of guanine and thymine to the string of DNA given to for each ID, then return the ID of the sample with the greatest percentage.

我正在处理页面上的示例问题,但遇到了一些困难。我知道我的代码可能非常低效和繁琐,但我认为对于那些刚接触编程的人来说是可以预期的。

无论如何,这是我的代码。

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]

仍然给我一个索引错误,但至少给了我想要的商业价值。

提前致谢。

2 个答案:

答案 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。