我正在分析一个 RNA 序列,需要在其中编码密码子。我首先需要将核苷酸字符串分成三对列表,但我必须为我的函数提供一个 Reading_frame 参数,该参数从索引 1、2 或 3 处开始读取字符串。
我编写了这段代码,但不知道为什么它不起作用,每当我对任何索引执行此操作时,我都会得到一个不完全读取的列表。
sequence = self.sequence.upper()
split_sequence = []
while len(sequence) >= 3:
split_sequence.append(sequence[reading_frame:reading_frame + 3])
reading_frame = reading_frame + 3
sequence = sequence[reading_frame:]
return split_sequence
我还尝试使用条件和正则表达式,但不知道如何为索引(reading_frame)1和2执行正则表达式
if reading_frame == 0:
split_sequence = re.findall(r'...', sequence)
if reading_frame == 1:
split_sequence = re.findall(r'', sequence)
if reading_frame == 2:
split_sequence = re.findall(r'', sequence)
关于如何修复这些方法有什么想法,或者有没有更简单的方法来做到这一点? 谢谢!
最佳答案
这是一个带有框架参数的生成器:
def codons(seq,frame):
n = len(seq)
for i in range(frame - 1, n - 2, 3):
yield seq[i:i+3]
例如:
test = 'ACTGCAGCATCAGCCATGCAACT'
for i in range(1,4):
print(list(codons(test,i)))
输出:
['ACT', 'GCA', 'GCA', 'TCA', 'GCC', 'ATG', 'CAA']
['CTG', 'CAG', 'CAT', 'CAG', 'CCA', 'TGC', 'AAC']
['TGC', 'AGC', 'ATC', 'AGC', 'CAT', 'GCA', 'ACT']
作为生成器,您可以按如下方式循环密码子:
>>> for codon in codons(test,1): print(codon)
ACT
GCA
GCA
TCA
GCC
ATG
CAA
请注意,生成器始终生成长度为 3 的完整密码子。如果给定的阅读框架以长度为 1 或 2 的片段结束,则生成器不会返回它。这种行为是设计使然,但如果您想要的话,可以很容易地将其修改为返回最终片段。
关于python - 如何从索引 0、1 或 2 开始每三个索引分割一个字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41006466/