python - 如何从索引 0、1 或 2 开始每三个索引分割一个字符串?

标签 python

我正在分析一个 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/

相关文章:

python - 如何强制 ipython 深度重新加载?

python - 为什么成功的 assertEqual 并不总是意味着成功的 assertItemsEqual?

android - Android 上的 Python 解释器

python - 如何在 Odoo 中以编程方式隐藏字段?

java - JNIUS 和 TIKA - 尝试 parseToString 时出错

python - Python MANIFEST.in 中的注释

Python如何在其中也包含字符串的列表中获取数字总和

Python字典,子元素访问

python - Tkinter 文本输入的返回值,关闭 GUI

python - 参数解析 : How to organize output and how to get str input?