Генерировать несколько случайных последовательностей ДНК в файле, содержащем не более 3 повторяющихся букв подряд

#python

#python

Вопрос:

У меня есть задание, в котором я должен генерировать случайные последовательности ДНК в файле, я получил его для генерации одной случайной, но у меня возникли проблемы с генерацией более одной. Мне также нужно добавить фрагмент кода, который запрещает случайной генерации иметь более 3 повторяющихся букв подряд, я не уверен, как это сделать. Это то, что у меня есть до сих пор:

 import random

def dna(length, sequences):
    f = open("dna.txt", 'w')
    dna = ["A", "T", "C", "G"]
    random_sequence = " "
    for i in range(length):
        random_sequence =random.choice(dna)
    list = []
    i = 0
    while i < sequences:
        x = random_sequence
        list.append(x)
        i = i i
    f.write(random_sequence)
    f.close()


print(dna(15, 20))
  

Комментарии:

1. Как бы вы хотели различать разные последовательности ДНК в файле? Вам нужен только один файл, верно? Кроме того, как бы вы гарантировали, что не более 3 повторяющихся символов, если бы вы делали это на бумаге? Не могли бы вы взять эту логику и перевести ее в код?

2. Решайте эту проблему по частям. Разбейте большие проблемы на более мелкие подзадачи и начните писать небольшие функции, которые обрабатывают меньшие подзадачи. Если подзадача кажется непреодолимой, сократите и эту подзадачу. Таким образом, вы можете собрать решение воедино, не перегружая себя. Разделяй и властвуй!

Ответ №1:

Вот простая реализация:

 import random

# Create a single sequence
def dna_seq(length, max_repeat=3):
    dna = ["A", "T", "C", "G"]
    seq = []
    while len(seq) < length:
        d = random.choice(dna)
        # Make sure no repeats > max_repeat
        if seq[-max_repeat:] != [d] * max_repeat:
            seq.append(d)
    return ''.join(seq)

# Create all the sequences and save
def dna(length, sequences):
  with open("dna.txt", 'w') as f:
      for _ in range(sequences):
          f.write(dna_seq(length)   'n')

dna(15, 20)