不断收到 IndexError 并且不确定为什么 Python
Constantly getting IndexError and am unsure why in Python
我是 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]
这仍然给我一个索引错误,但至少给了我我想要的商业价值。
提前致谢。
您正在遍历 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.
我是 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]
这仍然给我一个索引错误,但至少给了我我想要的商业价值。
提前致谢。
您正在遍历 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.