为三个阅读框创建列表的列表
我觉得从三个不同的框架读取一个序列会很酷,所以我把相关内容贴在下面。不过,我遇到了一个难题:怎么制作一个列表的列表。我的目标是得到一个最终的输出,显示每个框架的数据,并用 + 或 - 来表示读取的方向(比如 +1、+2、+3、-1、-2、-3),还有每个起始密码子的位置,以及它的终止密码子,最后是起始密码子和终止密码子之间的长度。(我只想找最长的开放阅读框,简称 ORF)输出的例子大概是这样的:
+1 57166..61908 4743.
我想要一个列表的列表,是因为我想把在下面代码中找到的所有起始密码子存起来,然后以某种方式放到输出里。我觉得列表的列表可能是从三个不同框架获取这些信息的最佳方式。不过,我不太确定该怎么开始……能不能给我一个起步的方法?我上次检查时,while 循环是正常工作的。谢谢。
def codons(self, frame_one, frame_two, frame_three):
while frame_one <=len(self.seq):
yield (self.seq[frame_one:frame_one+3])
frame_one += 3
while frame_two <=len(self.seq):
yield (self.seq[frame_two:frame_two+3])
frame_two += 3
while frame_three <=len(self.seq):
yield (self.seq[frame_three:frame_three+3])
frame_three += 3
val = seq.codons(0,1,2)
for i in val:
return(i)
self.startlist.append[[frame_one], [frame_two], [frame_three]]
2 个回答
一些建议:
return
只在函数定义和生成器中使用,其他地方用不到。你可能想用print()
来替代它。frame_one
、frame_two
和frame_three
是函数的参数(我猜的,因为看不到你代码的其他部分),在函数外是无法访问的。所以你最后的语句,看起来是在函数定义外(你的缩进正确吗?),不会像你想的那样工作,甚至根本无法工作。同样,由于我们看不到你的代码,
seq
是什么也不清楚——它是你类中的另一个函数吗?还是类的一个实例?还是类的属性?无论它是什么,确保在所有情况下都正确引用它。你在while
语句中提到self.seq
,这让我觉得它是类的另一个部分——可能是一个属性,因为你在计算它的长度。但在函数外,seq
变成了某种实例对象,调用它的方法codon()
。你不能这样做——试着用self.codon()
来调用。
仔细检查你的代码,逐行在 Python REPL 中运行,确保它确实正常工作。然后,回来问一个合理的问题,提供一些示例输入和预期输出,清楚地描述你想做什么,你到目前为止尝试了什么,以及哪里出错了,如果需要的话,附上相关错误的完整文本。我是生命科学的研究者,所以我知道什么是 ORF,但至少简单解释一下或链接到维基百科也是合适的。
我想你手上有一串来自DNA的核苷酸序列,你想知道在这串序列的三个不同阅读框中是否有基因存在。我建议使用Biopython来完成这个任务,但也有其他方法可以不使用“标准”解决方案。这里我分享一下我自己的一个解决办法。
主要的问题是如何找到甲硫氨酸的位置和终止密码子的位置(它们之间的长度只是个参考)。为了做到这一点,我们需要知道它们的样子:
start = 'AUG'
stop = ('UAA', 'UGA', 'UAG')
开放阅读框(ORF)的起始点是编码甲硫氨酸的密码子,而终止密码子可以是琥珀、黄褐或乳白色的密码子中的任何一个。
现在我们可以得到它们的位置列表:
sequence = "ATATAGACATCGAATACTAATAGCATACAGTCCAAATTCGGAGCCCGACATTCTTCGATAACGACCGCTGATTATATGGGGCTCCGTCTACTCTAGGAGTTCTTGGCTGAGCCCTTCTAATTACCCACCGGGTGGCACACCAAGGACCGAAAAACCGTGGCCCGTGGGGAAAGTATCAGAACGGTACGGACCGTTTTTCCACCTCAAGGGACACCTTTGTCCCCGCCAATTATGCCAACCTCTCATAGTATTATATCTCCTCAATTTCTATGTGCGCAGTGTCTGTATGTTAGGACGCGCATGCACTGAAATGGCGATAGTGTGAATACATAGGTCATCTTGTGCCAGTGGCTGACTGATCGTCTACAAGTGACAATGCTGTGAATAACAAGATTGTGCACATGTCTAACCCGTGAGCTGGAGCTCCATAGCTATGGAGCTCCAGCTCACGGGTTAGACATTTTACAGTAGCGTACATTTCTGGCCGACCAACAGTGCATGGAGTTCAAGGCACATCCTTACTAAATTCTCCGTGTCCAGATTTAACAGCGAAGACGCTTTCCACGGACACAAGTATGAAAAGCGGCCGAAGGGGTCATTTGGACCAATGGACTGTTAGCGATACGCAAGAGTGAAAGGCGGGCGATCCACATTACAAATCCCTATCAGGACTGCGAATAAGATTTTCCTGAATATGAGTGGTGTGGACAGAGCTATGTTTTTCGAATTCCGCACACTCGAGTGCGCGGCCTTCTCAGAGTTTTAAACTTTGCCTGGGTACTGATTATTATAGTCCAAGTAGAATAGTCACTCTATATTTTTAATAGAATGCGGGTGACACCGGCAAGAGAACCGAGCATTT"
start = 'ATG'
stop = ('TAA', 'TGA', 'TAG')
stop_positions = []
start_positions = []
# Normal direction
for i in range(len(sequence)): # Create the index value
if sequence[i:].startswith(start): # Check if there is a methionine in this position.
start_positions.append(i)
else:
for stop_codon in stop:
if sequence[i::].startswith(stop_codon): # Check if there is a stop in this position.
stop_positions.append(i)
break
要反转它们,我们可以使用 sequence = sequence[::-1]
,然后再重复上面的代码。(注意,如果这样做,你会得到反向的索引)现在我们需要判断哪些是开放阅读框,哪些不是。我们可以用几个循环来实现:
for start_ in start_positions:
for stop_ in stop_positions:
if stop_ <= start_:
continue
else:
print("{}...{}".format(start_, stop_))
break
获取阅读框的名称很简单,只需将起始位置除以3,余数减去1就是对应的框。
这是上面代码的输出,正如你所看到的,我没有实现你所需的所有功能,但添加这些功能并不复杂。
75...93
231...245
269...290
286...290
300...306
310...317
375...381
401...406
433...454
498...522
575...576
607...616
694...695
715...763
828...835
Reversed sequence
# Note that the indexes start from 1, to get the real index do len(sequence) -index
61...62
82...101
286...287
387...393
392...393
575...582
612...613
676...688
687...688
一些注意事项:
确保长度大于1个核苷酸。更快的方法是翻译序列,获取甲硫氨酸和终止密码子之间的所有内容。如果你使用的是Python 3,这段代码运行良好,如果你使用其他版本,可能需要做一些修改。
这段代码还有很多可以改进的地方,以获得你想要的确切结果。如果你无法调整这段代码来实现目标,或者你不太理解它的工作原理,可以在下面留言,或者如果你有更复杂的问题,可以另起一个问题并等待回复。(我不想直接回答Rosalind的问题)