【问题标题】:Create a list for values between certain occurences within a sequence . . . Python为序列中某些出现之间的值创建一个列表。 . . Python
【发布时间】:2012-09-21 23:01:43
【问题描述】:

我将发布一个关于我之前关于阅读框架的问题的后续问题。

sequence = 'AAATGAAATAAGGATGGGGTAGTATGATGTGTTT'

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

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() 函数仅适用于第一次出现,如果在 ' 之前有 'TAA' 或 'TAG' 或 'TGT' ATG'('ATG'应该是3的阅读框开始的那个)

如何创建符合这些条件的多个序列的列表(即将序列转换为 codon_list)?

【问题讨论】:

  • find 采用可选的start 索引,因此您可以编写s.find('ATG', i) 以在索引i 处开始搜索

标签: python list append frame


【解决方案1】:

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

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

【讨论】:

  • 很好的答案打败了我正在写的答案
  • @JoranBeasley:可能值得发布您的答案(我猜这是根据 isbadawi 的提示扩展的 OP 代码?),因为 OP 可能更容易理解。
  • meh 我已经摆脱了它......此外这是一个更好的解决方案,他应该努力编写这样的代码(我应该:P)
  • 是的,这是获得我想要的结果的一种非常非常简洁的方法,非常感谢。我无法使用 re.findall 来获取原始字符串中密码子的位置。我假设它的工作方式不同于 .find
  • nvm 我想通了。我在密码子中创建了一个 for 循环,然后是 empty_list.append(sequence.find(k))
猜你喜欢
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多