1

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

我正在处理这个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'(下一个密码子) ], ETC...

4

4 回答 4

2

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

于 2016-02-25T19:27:37.817 回答
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]
于 2016-02-25T19:29:33.467 回答
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]
于 2016-02-25T19:33:09.430 回答
1

不要复制bbmylist然后尝试mylist就地修改。只需从复制bbmylist

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']

于 2016-02-25T19:35:39.010 回答