这是代码(我从这个讨论Translation DNA to Protein中得到了它,但这里我使用的是RNA而不是DNA文件):
from itertools import takewhile
def translate_rna(sequence, d, stop_codons=('UAA', 'UGA', 'UAG')):
start = sequence.find('AUG')
# Take sequence from the first start codon
trimmed_sequence = sequence[start:]
# Split it into triplets
codons = [trimmed_sequence[i:i + 3] for i in range(0, len(trimmed_sequence), 3)]
# Take all codons until first stop codon
coding_sequence = takewhile(lambda x: x not in stop_codons and len(x) == 3, codons)
# Translate and join into string
protein_sequence = ''.join([codontable[codon] for codon in coding_sequence])
# This line assumes there is always stop codon in the sequence
return "{0}".format(protein_sequence)
调用translate_rna
函数:
sequence = ''
for line in open("to_rna", "r"):
sequence += line.strip()
translate_rna(sequence, d)
我的to_rna
文件如下:
CCGCCCCUCUGCCCCAGUCACUGAGCCGCCGCCGAGGAUUCAGCAGCCUCCCCCUUGAGCCCCCUCGCUU
CCCGACGUUCCGUUCCCCCCUGCCCGCCUUCUCCCGCCACCGCCGCCGCCGCCUUCCGCAGGCCGUUUCC
ACCGAGGAAAAGGAAUCGUAUCGUAUGUCCGCUAUCCAG.........
该函数仅转换第一个蛋白质(从第一个AUG
到第一个stop_codon
)
我认为问题出在这一行:
# Take all codons until first stop codon
coding_sequence = takewhile(lambda x: x not in stop_codons and len(x) == 3 , codons)
我的问题是:我如何告诉python(在找到第一个
AUG
并将其作为列表存储到coding_sequence
后)再次搜索AUG
在RNA文件中并将其放在下一个位置。
结果,我想有一个这样的清单:
['here_is_the_1st_coding_sequence', 'here_is_the_2nd_coding_sequence', ...]
PS:这是一个家庭作业,所以我不能使用Biopython。
修改
描述问题的简单方法:
从这段代码:
from itertools import takewhile
lst = ['N', 'A', 'B', 'Z', 'C', 'A', 'V', 'V' 'Z', 'X']
ch = ''.join(lst)
stop = 'Z'
start = ch.find('A')
seq = takewhile(lambda x: x not in stop, ch)
我想得到这个:
['AB', 'AVV']
编辑2:
例如,从这个字符串:
UUUAUGCGCCGCUAACCCAUGGUUCCCUAGUGGUCCUGACGCAUGUGA
我应该得到结果:
['AUGCGCCGC', 'AUGGUUCCC', 'AUG']
答案 0 :(得分:1)
查看你的基本代码,因为我无法完全遵循你的主要内容,看起来你只想在另一个字符串的所有出现时拆分你的字符串,并从另一个字符串的索引开始对字符串进行子串。如果这是错的,请告诉我,我可以相应更新。
为了实现这一点,python有一个内置str.split(sub)
,它会在sub
的每个出现时拆分一个字符串。此外,它有一个str.index(sub)
,它返回sub
的第一个索引。例如:
>>> ch = 'NABZCAVZX'
>>> ch[ch.index('A'):].split('Z')
['AB', 'CAV', 'X']
您还可以指定不仅仅是一个字符的子字符串:
>>> ch = 'NACBABQZCVEZTZCGE'
>>> ch[ch.index('AB'):].split('ZC')
['ABQ', 'VEZT', 'GE']
使用多个分隔符:
>>> import re
>>> stop_codons = ['UAA','UGA','UAG']
>>> re.compile('|'.join(stop_codons))\
>>> delim = re.compile('|'.join(stop_codons))
>>> ch = 'CCHAUAABEGTAUAAVEGTUGAVKEGUAABEGEUGABRLVBUAGCGGA'
>>> delim.split(ch)
['CCHA', 'BEGTA', 'VEGT', 'VKEG', 'BEGE', 'BRLVB', 'CGGA']
请注意,拆分没有优先顺序,即如果在UGA
之前有UAA
字符串,它仍会在UGA
上拆分。我不确定那是不是你想要的,但就是这样。