不断收到 IndexError 并且不确定为什么 Python

Constantly getting IndexError and am unsure why in Python

我是 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]

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

提前致谢。

您正在遍历 biz 的长度。所以在你的最后一次迭代中 biz[i+1]biz[i+2] 不存在。最后一个之后没有项目了。

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.