为什么在尝试删除时仍然会出现索引错误,当替换为字符时工作正常?

时间:2016-02-25 19:19:57

标签: python rosalind

编程newb / python newb,我的工作非常苛刻,所以我找到了很多空闲时间来教我自己如何编码。

我正在处理this rosalind.info问题。

到目前为止,这是我的代码:

# -*- coding: utf-8 -*-
"""
Created on Thu Jan 21 09:01:51 2016

@author: aseyedian
"""
codon = ''

q=0
with open('rosalind_prot.txt', 'r') as prot:
    bb = list(prot.read())

mylist = []   
for i in range(len(bb)):
     mylist.append(bb[i])


for i in range(0, len(bb),3):
    mylist[i] = [''.join(mylist[i:i+3])]

for i in range(1, len(mylist), 3):
    del mylist[i]

for i in range(2, len(mylist), 3):
    del mylist[i]

print mylist
#This is to create a list of codons which then are translated into amino acids

由于某种原因,

for i in range(1, len(mylist), 3):
        del mylist[i]

返回IndexError(列表赋值超出范围),但

for i in range(1, len(mylist), 3):
        mylist[i] = 'k'

将每一个列表成员变成字母' k'。这是为什么?

仅供参考,我现在尝试做的是将每个核苷酸放入一个列表中,然后将它们分组,然后在将它们合并到第一个列表成员后删除这两个列表成员,然后转到下一个密码子。

例如: [' A',' U'' G'] - > [[' AUG'],' U'' G'] - > [' AUG'],[' GCC' (下一个密码子)]等......

4 个答案:

答案 0 :(得分:2)

从列表中删除项目时,它现在具有较少的项目。因此,其长度 - 1位置的列表不再存在。假设您有一个长度为4的列表。一旦您尝试访问位置2的列表,您已经删除了2个项目,并且列表中只剩下2个项目。现在列表在位置2没有任何内容。相反,只有del mylist[0]

答案 1 :(得分:1)

考虑一个长度为3的列表:

l = ['1', '2', '3']

不,我们使用range(len(l))迭代它:

for i in range(len(l)):
    print('i =', i)
    print('l[i] =', l[i])
    del l[i]

结果如下:

i = 0
l[i] = 1
i = 1
l[i] = 3
i = 2
------------------------------------
IndexError
<ipython-input-6-ab3e74355e73> in <m
      1 for i in range(len(l)):
      2     print('i =', i)
----> 3     print('l[i] =', l[i])
      4     del l[i]

IndexError: list index out of range

所以在第一次迭代中,你删除了第一个元素'1', 这使列表保持为['2', '3']

然后我们删除列表的秒元素,现在是'3',列表变为['2', ]

在第三次迭代中,i = 2但列表只有一个元素,因此我们得到索引错误。

解决方案是反过来:

for i in reversed(range(1, len(mylist), 3)):
        del mylist[i]

答案 2 :(得分:1)

当您从中删除项目时,

mylist会发生更改 - 当您仍在使用基于其原始长度生成的索引时,它会包含较少的项目。

例如,

mylist = ['A', 'B', 'C', 'D', 'E']

您的代码假设从列表中删除“B”和“E”(编号1和4),

for i in range(1, len(mylist), 3):
    del mylist[i]

然而,在第一次传递“B”被移除后,该列表变为['A','C','D','E']。此时此列表中只有4个项目,并且不再存在第4个项目。

您要做的是从原始列表中获取包含#0,#3,#6,...项目的列表。你可以简单地使用这样的列表切片:

print mylist[0::3]

答案 3 :(得分:1)

不要将bb复制到mylist,然后尝试修改mylist。只需从bb复制到mylist

bb = 'AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUGA'
mylist = []
for i in range(0, len(bb), 3):
    mylist.append(bb[i:i+3])
print mylist

输出:

[&#39; AUG&#39;,&#39; GCC&#39;,&#39; AUG&#39;,&#39; GCG&#39;,&#39; CCC&#39;,& #39; AGA&#39;,&#39; ACU&#39;,&#39; GAG&#39;,&#39; AUC&#39;,&#39; AAU&#39;,&#39; AGU&# 39;,&#39; ACC&#39;,&#39; CGU&#39;,&#39; AUU&#39;,&#39; AAC&#39;,&#39; GGG&#39;,&# 39; UGA&#39;]