ДНК PSET6: код вычисляет только наибольшее количество последовательных повторов для одной последовательности STR

#python #cs50

#python #cs50

Вопрос:

Я написал код для подсчета наибольшего количества последовательных повторений определенных последовательностей подстрок ДНК (взятых из файла CSV) в длинной строке ДНК (взятой из текстового файла) … или так я думал. Хотя мой код может правильно подсчитать наибольшее количество последовательных повторов для последней подстроки ДНК в словаре подстрок, он не может этого сделать для других подстрок ДНК, предшествующих ему. Я пробовал несколько способов исправить свой код, но ничего не работает. Как мне подсчитать наибольшее количество последовательных повторов для каждой подстроки ДНК, а не только для одной? Приветствуются любые советы! Вот мой код:

 import sys
import csv

if len(sys.argv) != 3:
    print("Wrong number of files. Enter correct command-line arguments")
    exit(1)

with open (sys.argv[1],'r') as f:
    database_reader = csv.reader(f)
    strlist = next(database_reader)[1:]
    print(strlist)

    dna = open(sys.argv[2], "r")
    sequence_dna = dna.read()
    print(sequence_dna)

    long_str = {}

    for item in strlist:
        long_str[item] = 0

    for key in long_str:
        i = 0
        run = 0
        long_run = 0
        while i < len(sequence_dna):
            if sequence_dna[i:i len(key)] == key:
                run  = 1
                if run > long_run:
                    long_run = run
                i  = len(key)
            elif sequence_dna[i:i len(key)] != key:
                if run > long_run:
                    long_run = run
                run = 0
                i  = 1
    long_str[key] = long_run
    print(long_str)

    for row in database_reader:
        individual = row[0]
        values = [int(value) for value in row[1:]]
        if values == long_str:
            print(individual)
            break
        elif values != long_str:
            print("No match")
            break
  

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

1. О, я пропустил, что именно вы хотели знать. Возможно, отступ long_str[key] = long_run должен быть назначен всем ключам в цикле for. Теперь ему просто присваивается последний ключ и количество.

2. О боже, я не могу поверить, что не учел, что отступ мог быть проблемой. Спасибо! Ваше предложение сработало!

3. Возможно, я ошибаюсь, но в последнем цикле for, похоже, есть проблемы. if values == long_str: проверяет равенство между списком целых чисел и long_str который является словарем. Я не думаю, что из-за этого оператор if может быть истинным. Возможно, можно было бы написать: if values == long_str.values() , но я не уверен, что это сработает.

4. Это должно читаться вместо этого, я думаю if values == list(long_str.values())

5. Спасибо. Я сделал это, но теперь проблема в том, что я продолжаю не получать совпадений при сравнении значений словаря с данными в файле csv, когда я на самом деле должен получить совпадение. Я распечатал long_str словарь и вижу, что он выводится три раза: по одному после каждой итерации для каждого ключа. Я думаю, именно поэтому я не получаю совпадений в качестве выходных данных. Теперь мне нужна помощь в поиске способа просто получить последнюю итерацию

Ответ №1:

Следующий измененный код должен работать. Как и сейчас, если первое лицо (или последующие лица) для проверки не равно входному файлу последовательности, цикл завершится вместо проверки всех, пока не будет найдено совпадение (или совпадений не будет). elif Здесь неверно.

 found = False
for row in database_reader:
    individual = row[0]
    values = [int(value) for value in row[1:]]
    if values == list(long_str.values()):
        found = True
        print(individual)
        break

if found == False:
    print('no match')
  

Когда я запустил свою версию (не приведенную здесь), она соответствовала ответам, данным для этого упражнения.

 C:Old_DatapythonHarvarddna>python dna2.py databases/small.csv sequences/1.txt
Bob

C:Old_DatapythonHarvarddna>python dna2.py databases/small.csv sequences/2.txt
no match

C:Old_DatapythonHarvarddna>python dna2.py databases/small.csv sequences/3.txt
no match

C:Old_DatapythonHarvarddna>python dna2.py databases/small.csv sequences/4.txt
Alice

C:Old_DatapythonHarvarddna>python dna2.py databases/large.csv sequences/5.txt
Lavender

C:Old_DatapythonHarvarddna>python dna2.py databases/large.csv sequences/6.txt
Luna

C:Old_DatapythonHarvarddna>python dna2.py databases/large.csv sequences/7.txt
Ron

C:Old_DatapythonHarvarddna>python dna2.py databases/large.csv sequences/8.txt
Ginny

C:Old_DatapythonHarvarddna>python dna2.py databases/large.csv sequences/9.txt
Draco

C:Old_DatapythonHarvarddna>python dna2.py databases/large.csv sequences/10.txt
Albus

C:Old_DatapythonHarvarddna>python dna2.py databases/large.csv sequences/11.txt
Hermione

C:Old_DatapythonHarvarddna>python dna2.py databases/large.csv sequences/12.txt
Lily

C:Old_DatapythonHarvarddna>python dna2.py databases/large.csv sequences/13.txt
no match

C:Old_DatapythonHarvarddna>python dna2.py databases/large.csv sequences/14.txt
Severus

C:Old_DatapythonHarvarddna>python dna2.py databases/large.csv sequences/15.txt
Sirius

C:Old_DatapythonHarvarddna>python dna2.py databases/large.csv sequences/16.txt
no match

C:Old_DatapythonHarvarddna>python dna2.py databases/large.csv sequences/17.txt
Harry

C:Old_DatapythonHarvarddna>python dna2.py databases/large.csv sequences/18.txt
no match

C:Old_DatapythonHarvarddna>python dna2.py databases/large.csv sequences/19.txt
Fred

C:Old_DatapythonHarvarddna>python dna2.py databases/large.csv sequences/20.txt
no match

C:Old_DatapythonHarvarddna>python dna2.py databases/large.csv
Usage: python dna2.py <databases/database> <sequences/seq>