【问题标题】:Python DNA translationPython DNA 翻译
【发布时间】:2020-05-02 05:36:50
【问题描述】:

我必须创建自己的 biopython。可以读取 DNA、转录和翻译的东西。我已经明白它可以做到所有这些,但我无法弄清楚如何让程序识别'atg'之后的3组密码子,直到它到达一个终止密码子。现在它只找到一个起始密码子,然后找到最近的终止密码子,而不用 3 计数。有人可以帮我解决这个问题吗?对不起,如果这没有意义

#locate start codons
startcodon=0
n=0
while(n < 1):
    startcodon=dataset.find("atg", startcodon, len(dataset)-startcodon)
    #locate stop codons
    taacodon=dataset.find("taa", startcodon+3, len(dataset)-startcodon)
    tagcodon=dataset.find("tag", startcodon+3, len(dataset)-startcodon)
    tgacodon=dataset.find("tga", startcodon+3, len(dataset)-startcodon)
    if(taacodon<tagcodon):
        if(taacodon<tgacodon):
            stopcodon=taacodon
            #print("taacodon", startcodon)
        else:
            stopcodon=tgacodon
            #print("tGacodon", startcodon)

    elif(tgacodon>tagcodon):
        stopcodon=tagcodon
        #print("taGcodon", startcodon)
    else:
        stopcodon=tgacodon
        #print("tGacodon", startcodon)
    #to add sequences to an array
    codon.append(dataset[startcodon:stopcodon+3])
    if(startcodon > len(dataset) or startcodon < 0):
        n = 2;
    startcodon=stopcodon

#reverse the string and swap the letters
n=0;
while(n < len(codon)):
        rcodon.append (codon[n][len(codon[n])::-1])
        #replace a with u
        rcodon[n] = re.sub('a', "u", rcodon[n])
        #replace t with a
        rcodon[n] = re.sub('t', "a", rcodon[n])
        #replace c with x
        rcodon[n] = re.sub('c', "x", rcodon[n])
        #replace g with c
        rcodon[n] = re.sub('g', "c", rcodon[n])
        #replace x with g
        rcodon[n] = re.sub('x', "g", rcodon[n])
        print("DNA sequence: ", codon[n] ,'\n', "RNA sequence:", rcodon[n])
        n=n+1
answer = 0
print("Total Sequences:  ", len(codon)-3)
while (int(answer) >=0):
        #str = "Please enter an integer from 0 to " + str(len(dataset)) + " or -1 to quit: "
        answer = int(input("Please enter a sequence you would like to see or -1 to quit:  "))
        if(int(answer) >= 0):
                print("DNA sequence: ", codon[int(answer)] ,'\n', "RNA sequence:", rcodon[int(answer)])
        dna = codon[int(answer)]
        #dna codon table
        protein = {"ttt" : "Phe-", "ctt" : "Leu-", "att" : "Ile-", "gtt" : "Val-",
           "ttc" : "Phe-", "ctc" : "Leu-", "atc" : "Ile-", "gtc" : "Val-",
           "tta" : "Leu-", "cta" : "Leu-", "ata" : "Ile-", "gta" : "Val-",
           "ttg" : "Leu-", "ctg" : "Leu-", "atg" : "Met-", "gtg" : "Val-",
           "tct" : "Ser-", "cct" : "Pro-", "act" : "Thr-", "gct" : "Ala-",
           "tcc" : "Ser-", "ccc" : "Pro-", "acc" : "Thr-", "gcc" : "Ala-",
           "tca" : "Ser-", "cca" : "Pro-", "aca" : "Thr-", "gca" : "Ala-",
           "tcg" : "Ser-", "ccg" : "Pro-", "acg" : "Thr-", "gcg" : "Ala-",
           "tat" : "Tyr-", "cat" : "His-", "aat" : "Asn-", "gat" : "Asp-",
           "tac" : "Tyr-", "cac" : "His-", "aac" : "Asn-", "gac" : "Asp-",
           "taa" : "STOP", "caa" : "Gin-", "aaa" : "Lys-", "gaa" : "Glu-",
           "tag" : "STOP", "cag" : "Gin-", "aag" : "Lys-", "gag" : "Glu-",
           "tgt" : "Cys-", "cgt" : "Arg-", "agt" : "Ser-", "ggt" : "Gly-",
           "tgc" : "Cys-", "cgc" : "Arg-", "agc" : "Ser-", "ggc" : "Gly-",
           "tga" : "STOP", "cga" : "Arg-", "aga" : "Arg-", "gga" : "Gly-",
           "tgg" : "Trp-", "cgg" : "Arg-", "agg" : "Arg-", "ggg" : "Gly-"  
           }
        protein_sequence = ""

        # Generate protein sequence
        for i in range(0, len(dna)-(3+len(dna)%3), 3):
                protein_sequence += protein[dna[i:i+3]]

        # Print the protein sequence
        print ("Protein Sequence: ", protein_sequence)

我一直在使用的 DNA 序列以“ggtcagaaaaaagccctctccatgtctactcacgatacatccctgaaaaccactgaggaagtggcttttcagatcatcttgctttgccagtttggggttgggacttttgccaatgtatttc”开头,因此它不以 atg 开头,而是必须搜索它。提前感谢您的任何建议

【问题讨论】:

    标签: python loops for-loop range biopython


    【解决方案1】:

    现在它只找到一个起始密码子,然后找到最近的终止密码子,而不用 3 来计数。

    如果您想搜索与特定帧对齐的子字符串(即可被 3 整除的索引),您可以先将字符串分成相等的块,然后在结果列表中搜索匹配的块。

    例如

    dataset_codons = [dataset[i:i+3] for i in range(0, len(dataset), 3)]
    # ggtcagaaaaagccctctcca becomes [ggt cag aaa aag ccc tct cca]
    
    try:
        startcodon = dataset_codons.index('atg', startcodon, len(dataset_codons) - startcodon)
    except ValueError:
        break # no more start codons found
    

    (注意startcodon将是匹配atg的块的索引,正好是对应字符串索引的1/3)

    编辑:如果终止密码子只需要与其起始密码子在同一帧上,但起始密码子可以在任何地方,那就有点棘手了。在这种情况下,您可以继续搜索终止密码子,直到找到索引良好的终止密码子:

    def find_codon(codon, string, start):
        i = start + 3
        while i < len(string):
            i = string.find(codon, i) # find the next substring
            if (i - start) % 3 == 0:  # check that it's a multiple of 3 after start
                return i
        return None
    
    
    
    startcodon=dataset.find("atg", startcodon)
    #locate stop codons
    taacodon=find_codon("taa", dataset, startcodon)
    tagcodon=find_codon("tag", dataset, startcodon)
    tgacodon=find_codon("tga", dataset, startcodon)
    
    stopcodon = min(taacodon, tagcodon, tgacodon)
    

    顺便说一句,我不确定我是否正确理解参数len(dataset)-startcodon 的用途。 str.find() 的第三个参数指定字符串内搜索范围的结束,这意味着随着startcodon 的增加,搜索将在数据集的实际结束处停止。

    【讨论】:

    • 您编辑的内容更符合我的要求。这将放在代码中的什么位置?
    • 另外,我如何让它列出它找到的每个“块”?就像,打印起始密码子和它找到的任何终止密码子之间的序列。抱歉这么多问题,这是我第一次使用python
    • @Lauren find_codon() 是一个单独的函数;其他行替换循环中的相应行(在行while (n&lt;1)#to add sequences to an array 之间)。您的代码的其余部分(包括 codon.append(dataset[startcodon:stopcodon+3]) 将保持不变,因此它仍然像以前一样构建序列列表。)
    【解决方案2】:

    如果你想找到起始密码子后3个终止密码子,你可以拆分起始密码子后面的DNA串,看看密码子列表中是否有终止密码子。

    sequence =  "ggtcagaaaaagccctctccatgtctactcacgatacatccctgaaaaccactgaggaagtggcttttcagatcatcttgctttgccagtttggggttgggacttttgccaatgtatttc"
    startcodon = 0
    length = len(sequence)
    startcodon = sequence.find("atg", startcodon)
    # list comprehension. could get codon_list in a for cycle
    codon_list = [sequence[i:i+3] for i in range(startcodon+3, length-3, 3)]
    
    # use list.index() to find out whether there is a stop codon in the codon_list
    # list.index() would throw error if value is not in the list
    try:
        taacodon = startcodon + 3 * codon_list.index('taa')
        print('taa codon is at {}'.format(taacodon))
    except:
        print('taa codon is not in the list')
    

    我认为拆分DNA序列比使用str.find更有效,因为你需要搜索停止密码子计数3,如果使用str.find,你需要判断是否发现终止密码子在 3 处。


    编辑:目前我不知道创建新的字符串列表是否会比在原始字符串中搜索花费更多。

    【讨论】:

    • 我将如何使用他们所在的位置作为休息点,而不仅仅是数字位置?
    • 抱歉回复晚了。我不清楚您在评论中提出的问题。如果您的意思是打印起始密码子和终止密码子之间的序列,使用我的拆分方法中的位置,dna[startcodon:endcodon_location] 应该打印它。
    • 我想说的是,再想一想,我发现我不确定拆分是否更有效,因为创建字符串列表会产生成本。这可能是另一个问题。为了获得更好的结果,我建议您阅读ask good question 的帮助。此外,最好在发布的问题中只问一个问题。
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 2011-07-04
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多