python - rna 到蛋白质的翻译器
问题描述
我目前正在开发我的第一个网站,这是一个 dna 翻译器,您可以将您的 dna 翻译成某种蛋白质。为此,我在视图中创建了一个类,如下所示:
class TranslatorView(View):
template_name = 'main/translated.html'
mapper = {
"a": "u",
"t": "a",
"c": "g",
"g": "c"
}
mapper_1={ #Here's the protein dictionary
"aat": "Asparagine",
"aac": "Asparagine",
"aaa": "Lysine",
"aag": "Lysine",
"act": "Threonine",
"acc": "Threonine",
"aca": "Threonine",
"acg": "Threonine",
"agt": "Serine",
"agc": "Serine",
"aga": "Arginine",
"agg": "Arginine",
"att": "Isoleucine",
"atc": "Isoleucine",
"ata": "Isoleucine",
"atg": "Methionine",
"cat": "Histidine",
"cac": "Histidine",
"caa": "Glutamine",
"cag": "Glutamine",
"cct": "Proline",
"ccc": "Proline",
"cca": "Proline",
"ccg": "Proline",
"cgt": "Arginine",
"cgc": "Arginine",
"cga": "Arginine",
"cgg": "Arginine",
"ctt": "Leucine",
"ctc": "Leucine",
"cta": "Leucine",
"ctg": "Leucine",
"gat": "Aspartic",
"gac": "Aspartic",
"gaa": "Glutamic",
"gag": "Glutamic",
"gct": "Alanine",
"gcc": "Alanine",
"gca": "Alanine",
"gcg": "Alanine",
"ggt": "Glycine",
"ggc": "Glycine",
"gga": "Glycine",
"ggg": "Glycine",
"gtt": "Valine",
"gtc": "Valine",
"gta": "Valine",
"gtg": "Valine",
"tat": "Tyrosine",
"tac": "Tyrosine",
"taa": "Stop",
"tag": "Stop",
"tct": "Serine",
"tcc": "Serine",
"tca": "Serine",
"tcg": "Serine",
"tgt": "Cysteine",
"tgc": "Cysteine",
"tga": "Stop",
"tgg": "Tryptophan",
"ttt": "Phenylalanine",
"ttc": "Phenylalanine",
"tta": "Leucine",
"ttg": "Leucine",
}
def translate(self, phrase):
translation = ""
for letter in phrase:
if letter.lower() in self.mapper:
translation += self.mapper[letter.lower()].upper() if letter.isupper() else self.mapper[letter]
return translation
def translate_protein(self,phrase): #Here's where I think the error is, The for loop should get the letters in groups of three, but Idk how to do it.
protein = ""
for letter in phrase:
if letter.lower() in self.mapper_1:
protein += self.mapper_1[letter.lower()].upper() if letter.isupper() else self.mapper_1[letter]
return protein
def get(self, request, *args, **kwargs):
return render(request, 'main/translator.html')
def post(self, request, *args, **kwargs):
phrase = request.POST.get('text', 'translation')
protein = request.POST.get('text','protein')
return render(request, self.template_name, {'translation': self.translate(phrase), 'protein': self.translate_protein(protein)})
模板是这样的:
{% extends "base.html"%}
{% block content%}
<div >
<h2 class = "display-3">DNA TRANSLATED SUCCESFULLY </h2>
<br>
<br>
<br>
<h2>
{{ translation }}
</h2>
<br>
<br>
<br>
<h2 class = "display-4">YOUR PROTEIN IS</h2>
<div class = "protein_image"></div>
<br>
<br>
<h2>
{{ protein }}
</h2>
<button class= "button_with_image_save" value="Back" onclick="window.history.back()" ></button>
</div>
{% endblock content%}
如果我输入像 atc 这样的链,蛋白质不会出现,因为翻译蛋白质中的 for 循环可能是错误的。
如您所见,出现了 rna 密码子,但没有出现蛋白质。
如果有人知道错误在哪里,如果你告诉我,那就太棒了。
解决方案
if letter.lower() in self.mapper_1:
永远不会返回 True 因为单个字母不能等于您正在循环的字符串(字典中的键),您猜对了。
翻译单个氨基酸:
def translate_amino(self, codon):
return self.mapper_1.get(phrase, "")
然后我建议再增加 1 个函数来实际返回蛋白质,因为我不确定你应该如何写出蛋白质,所以我将按顺序返回氨基酸列表:
def build_protein(self, phrase):
"""Accepts RNA sequence and returns corresponding sequence of amino acids."""
protein = []
i = 0
while i < len(phrase):
codon = phrase[i: i + 3]
amino = self.translate_amino(codon)
if amino:
protein.append(amino)
else:
print(f"The codon {codon} is not in self.mapper_1")
i += 3
return protein
对我来说,运行这个:
test = TranslatorView()
print(test.build_protein('tcgtgtgtcagg'))
给出:['Serine', 'Cysteine', 'Valine', 'Arginine']
推荐阅读
- javascript - 与没有道具的子组件共享数据
- python - 矩阵内的平均值
- javascript - 正则表达式匹配除“DC”之外的所有标点符号
- r-markdown - 当 self_contained = TRUE 时,如何在 bookdown::gitbook 中正确呈现数学方程?
- css - FancyBox 3 全屏图像
- javascript - 如何将多个东西放在本地存储的数组中并挑选出我需要的东西?
- r - 根据 r 中 df1 和 df2 之间的匹配在 df1 中添加一个新列
- javascript - document.scrollingElement.scrollHeight 和 document.body.scrollHeight 有什么区别?
- ios - iOS 14 Firebase 动态链接问题
- maven - 如何在 Maven 发布期间完全跳过单元测试和集成测试准备并使用 Maven 发布插件执行