CS50: PSET6 [DNA] L oop неправильно считает самый длинный цикл STR - PullRequest
0 голосов
/ 08 мая 2020

Я разместил вопрос о cs50 stackexchange, но не получил ответа, я уже неделю застрял на этой задаче ...

Ссылка: https://cs50.stackexchange.com/questions/37281/pset6-dna-loop-miscounts-longest-run-of-str

Но подведем итог ... Мой код должен перебирать последовательность ДНК и подсчитывать самый длинный последовательный прогон короткого тандемного повтора (STR), а затем сравнивать его с данной базой данных, чтобы идентифицировать кому принадлежит эта ДНК.

Прямо сейчас я работаю над подсчетом самого длинного прогона STR, я считаю, что мой лог c верен, но я не могу определить, почему мой код неправильно считает STR большую часть время.

For clarity: 
if the expected output is [18, 23, 35, 13, 11, 19, 14, 24]
the actual output is [18, 23, 36, 13, 15, 19, 15, 26]

Материал PSET: https://cdn.cs50.net/2019/fall/psets/6/dna/dna.zip

В основном вы передаете базу данных как 1-й аргумент командной строки, а последовательность ДНК - как 2-й. В случае примера, использованного выше, я использовал large.csv 6.txt

Я слишком долго застрял на этой задаче, и помощь будет очень признательна. Спасибо.

# modules
import sys
import csv

# ensure proper usage
if len(sys.argv) != 3:
    print("Usage: python dna.py data.csv sequence.txt")
    sys.exit()

database = sys.argv[1]
sequence = sys.argv[2]

run = 0
longrun = 0
STR_Count = []

# open database
with open(database, newline='') as csvfile:
    db_reader = csv.reader(csvfile)
    # a list of STRs
    STR = list(next(db_reader))
    STR.pop(0)

# open DNA sequence file
with open(sequence, newline='') as txtfile:
    seq_reader = txtfile.read()

# for every STR
for x in range(len(STR)):
    # iterate over the entire sequence
    for y in range(len(seq_reader)):
        # if STR matches sub-string
        if STR[x] == seq_reader[y:y + len(STR[x])]:
            run += 1
            # update index
            y = y + len(STR[x])

            # if STR no longer matches sub-string
            if not STR[x] == seq_reader[y:y + len(STR[x])]:
                if run > longrun:
                    longrun = run
                    run = 0
    STR_Count.append(longrun)
    run = 0
    longrun = 0
print(STR_Count)
...