CS50 DNA работает для small.csv, но не для больших - PullRequest
0 голосов
/ 26 апреля 2020

У меня проблемы с ДНК CS50 pset6. Он получает все правильные значения и дает правильные ответы, когда я использую файл small.csv, но не когда я использую большой файл. Я работал с debug50 уже более недели и не могу понять проблему. Я предполагаю, что проблема заключается в том, что где-то в l oop через образцы, чтобы найти STRS, но я просто не вижу, что он делает неправильно при прохождении через него.

Если вы не знакомы с набором проблем CS50 DNA предполагается, что код просматривает последовательность днк (argv[1]) и сравнивает ее с CSV-файлом, содержащим STR ДНК людей, чтобы выяснить, к какому человеку (если он есть) он принадлежит.

Примечание; Мой код не работает внутри корпуса; (Python dna.py database / large.csv sequence / 5.txt), если это поможет.

from sys import argv
from csv import reader


#ensures correct number of arguments
if (len(argv) != 3):
    print("usage: python dna.py data sample")


#dict for storage
peps = {}
#storage for strands we look for.
types = []

#opens csv table
with open(argv[1],'r') as file:
    data = reader(file)
    line = 0
    number = 0
    for l in data:
        if line == 0:
            for col in l:
                if col[2].islower() and col != 'name':
                    break
                if col == 'name':
                    continue
                else:
                    types.append(col)
            line += 1
        else:
            row_mark = 0
            for col in l:
                if row_mark == 0:
                    peps[col] = []
                    row_mark += 1
                else:
                    peps[l[0]].append(col)



#convert sample to string
samples = ""

with open(argv[2], 'r') as sample:
    for c in sample:
        samples = samples + c




#DNA STR GROUPS
dna = { "AGATC" : 0,
        "AATG" : 0,
        "TATC" : 0,
        "TTTTTTCT" : 0,
        "TCTAG" : 0,
        "GATA" : 0,
        "GAAA" : 0,
        "TCTG" : 0 }

#go through all the strs in dna
for keys in dna:
    #the longest run of sequnace
    longest = 0
    #the current run of sequances
    run = 0
    size = len(keys)
    #look through sample for longest
    i = 0
    while i < len(samples):
        hold = samples[i:(i + size)]
        if hold == keys:
            run += 1
            #ensure the code does not go outside len of samples
            if ((i + size) < len(samples)):
                i = i + size
            continue
        if run > longest:
            longest = run
            run = 0
        i += 1
    dna[keys] = longest

#see who it is
positive = True
person = ''
for key in peps:
    positive = True
    for entry in types:
        x = types.index(entry)
        test = dna.get(entry)
        can = int(peps.get(key)[x])
        if (test != can):
            positive = False
    if positive == True:
        person = key
        break
if person != '':
    print(person)
else:
    print("No match")

1 Ответ

1 голос
/ 26 апреля 2020

Проблема в этом, в то время как l oop. Внимательно посмотрите на этот код.

while i < len(samples):
    hold = samples[i:(i + size)]
    if hold == keys:
        run += 1
        #ensure the code does not go outside len of samples
        if ((i + size) < len(samples)):
            i = i + size
        continue
    if run > longest:
        longest = run
        run = 0
    i += 1

У вас отсутствует логика c здесь. Вы должны проверить самую длинную последовательную последовательность ДНК. Поэтому, когда у вас есть повторение последовательности ДНК спина к спине, вам нужно выяснить, сколько раз она повторяется. Когда это больше не повторяется, только тогда вам нужно проверить, является ли это самой длинной последовательностью.

Решение

Вам необходимо добавить оператор else после оператора if hold==keys:. Это было бы правильным решением;

while i < len(samples):
    hold = samples[i:(i + size)]
    if hold == keys:
        run += 1
        #ensure the code does not go outside len of samples
        if ((i + size) < len(samples)):
            i = i + size
        continue
    else: #only if there is no longer sequence match, check this.
        if run > longest:
            longest = run
            run = 0
        else: #if the number of sequence match is still smaller then longest, then make run zero.
            run = 0
    i += 1
...