首页 > 解决方案 > 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 密码子,但没有出现蛋白质。

如果有人知道错误在哪里,如果你告诉我,那就太棒了。

标签: pythonhtmlcssdjango

解决方案


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


推荐阅读