为什么我在尝试删除时总是出现索引错误,而用字符替换却工作正常?
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']
编程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']