为什么我在尝试删除时总是出现索引错误,而用字符替换却工作正常?

Why do I keep getting an index error when trying to delete, when replacing with a character works fine?

编程newb/python新手,我的工作要求不高,所以我找到了很多空闲时间来自学如何编码。

我正在工作thisrosalind.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]

returns IndexError(列表赋值超出范围),但是,

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

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

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

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

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

考虑一个长度为 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]

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]

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

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

输出:

['AUG', 'GCC', 'AUG', 'GCG', 'CCC', 'AGA', 'ACU', 'GAG', 'AUC', 'AAU', 'AGU', 'ACC', 'CGU', 'AUU', 'AAC', 'GGG', 'UGA']