为序列中某些出现之间的值创建列表。Python

2024-04-29 13:02:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我发布了一个关于阅读框架的后续问题。你知道吗

sequence = 'AAATGAAATAAGGATGGGGTAGTATGATGTGTTT'

我最终要寻找一个特定的模式“ATG”,我想扫描输入序列,直到找到它。一旦找到它,我希望它继续读取3帧,直到它找到另一个序列“TAA”或“TAG”或“TGT”,然后继续扫描,直到它找到下一个带有下游“TAA”或“TAG”或“TGT”的“ATG”

codon_list = ['ATG','AAA','TAA'],['ATG','GGG','TAG'],['ATG','ATG','TGT']

我在试这个

start_frame = sequence.find('ATG')

但这只会让我第一次出现“ATG”。(即“2”)

只是为了我写的第一个密码子列表

for codon in range(len(sequence)):
    next_codon = fdna[start_frame:start_frame + 3]
    codon_list.append(next_codon)
    start_frame = start_frame + 3
    if next_codon == 'TAA': 
        break
    if next_codon == 'TAG':
        break
    elif next_codon=='TGT':
        break
print codon_list
>>> ['ATG','AAA','TAA']

它只适用于“ATG”的首次出现。你知道吗

下一部分是我想为每个密码子(0,1,2,3,…)创建一个名称,我想我已经找到了这个部分:

indx = range(0,len(codon_list))

indx_codon = dict(zip(indx,codon_list)

indx_codon = {0:['ATG','AAA','TAA'],1:['ATG','GGG','TAG'],2:['ATG','ATG','TGT']}

codon_start = ['2','13','23']
codon_end = ['8','21','31']
codon_positions = []

for p,q in zip(codon_start,codon_end):
    codon_positions.append(str(p)+':'+str(q))

print codon_positions
>>> ['2:8', '13:21', '23:31']

因此,我最大的问题是.find()函数只在第一次出现时才起作用,如果在“ATG”之前有一个“TAA”或“TAG”或“TGT”(“ATG”应该是启动3的读取帧的函数),那么当我创建索引时,它就会出错

如何创建遵循这些标准的多个序列的列表(即将序列转换为密码子列表)?


Tags: 列表tag序列framestartlistnext密码子
1条回答
网友
1楼 · 发布于 2024-04-29 13:02:13

下面是一个使用正则表达式的相当简洁的解决方案:

import re
sequence = 'AAATGAAATAAGGATGGGGTAGTATGATGTGTTT'
codons = re.findall(r'ATG(?:...)*?(?:TAA|TAG|TGT)', sequence)
codon_list = [[s[i:i+3] for i in range(0, len(s), 3)] for s in codons]

结果:

>>> codon_list
[['ATG', 'AAA', 'TAA'], ['ATG', 'GGG', 'TAG'], ['ATG', 'ATG', 'TGT']]

相关问题 更多 >