Генерирование последовательности ДНК, исключая специфическую последовательность - PullRequest
0 голосов
/ 12 ноября 2018

Я только начал изучать программирование на python. В классе нас попросили сгенерировать случайную последовательность ДНК, которая НЕ содержит конкретной 6-буквенной последовательности (AACGTT). Смысл в том, чтобы создать функцию, которая всегда возвращает легальную последовательность. В настоящее время моя функция генерирует правильную последовательность примерно в 78% случаев. Как я могу сделать так, чтобы он возвращал юридическую информацию 100% времени? Любая помощь приветствуется.

Вот как выглядит мой код:

from random import choice
def generate_seq(length, enzyme):
    list_dna = []
    nucleotides = ["A", "C", "T", "G"]
    i = 0
    while i < 1000:
        nucleotide = choice(nucleotides)
        list_dna.append(nucleotide)
        i = i + 1

    dna = ''.join(str(nucleotide) for nucleotide in list_dna)
    return(dna) 


seq = generate_seq(1000, "AACGTT")
if len(seq) == 1000 and seq.count("AACGTT") == 0:
    print(seq)

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Одна идея состоит в том, чтобы проверить, были ли предыдущие 5 нуклеотидов равны AACGT, в этом случае выбрать только от ["A", "C", "G"].

from random import choice


def generate_seq(length, enzyme, bad_prefix="AACGT"):
    list_dna = []
    nucleotides = ["A", "C", "T", "G"]
    i = 0
    while i < 1000:
        if list_dna[-5:] != bad_prefix:
            nucleotide = choice(nucleotides)
        else:
            nucleotide = choice(["A", "C", "G"])
        list_dna.append(nucleotide)
        i = i + 1

    dna = ''.join(str(nucleotide) for nucleotide in list_dna)
    return dna


seq = generate_seq(1000, "AACGTT")
if len(seq) == 1000 and seq.count("AACGTT") == 0:
    print(seq)
0 голосов
/ 12 ноября 2018

Один из вариантов - проверить последние несколько записей в цикле и продолжать добавлять, только если «плохая» последовательность не была создана. Тем не менее, это может привести к более высокой, чем истинно-случайной вероятности наличия последовательности "AACGT", просто с другой буквой вместо последней буквы "T"

from random import choice
def generate_seq(length, enzyme):
    list_dna = []
    nucleotides = ["A", "C", "T", "G"]
    i = 0
    while i < 1000:
        nucleotide = choice(nucleotides)
        list_dna.append(nucleotide)
        #check for invalid sequence. If found, remove last element and redraw
        if ''.join(list_dna[-6:]) == "AACGTT":
            list_dna.pop()
        else:
            i = i + 1

    dna = ''.join(str(nucleotide) for nucleotide in list_dna)
    return(dna) 


seq = generate_seq(1000, "AACGTT")
if len(seq) == 1000 and seq.count("AACGTT") == 0:
    print(seq)
...