- Чтение базы данных CSV людей и их подсчетов STR.
- Вычисление самых длинных последовательных серий каждого STR в заданной последовательности ДНК.
- Сравнение этих подсчетов с каждой строкой в базе данных, чтобы найти совпадение.
Однако, когда я сравниваю результаты с каждой строкой в CSV, выходные данные сбиваются с толку, и я не могу понять, почему.
Что происходит
- Перед сравнением я печатаю значения из обоих словарей для каждой подпоследовательности.
- Программа печатает одно и то же значение строки[...] несколько раз. Например: строка Алисы печатается 3 раза, строка Боба 2 раза, строка Чарли один раз, даже когда я меняю входной файл или последовательность ДНК.
- Числа, напечатанные под строкой: и результатами:, должны представлять значения STR из строки CSV и из моих вычисленных результатов, но я не понимаю, почему одни и те же значения появляются несколько раз или почему выходные данные повторяются в этом конкретном случае. шаблон.
- Сравнение всегда терпит неудачу, даже если значения кажутся совпадающими.
- Одни и те же значения строк печатаются несколько раз.
- Количество повторов кажется постоянным (например, Алиса печатает 3 раза, независимо от файла).
- Иногда значения Row: иResults: совпадают, но код по-прежнему печатает «Нет совпадения».
Мой вопрос
Что может привести к такому повторению значений Row: и что именно представляют эти напечатанные числа во время цикла?
Мой код
from csv import DictReader
import sys
def main():
if len(sys.argv) != 3:
print("Error: Incorrect number of arguments")
return 1
rows = []
filename = sys.argv[1]
with open(filename) as file:
file_reader = DictReader(file)
for row in file_reader:
rows.append(row)
dna_sequence = []
f = sys.argv[2]
with open(f) as file:
dna_sequence = file.read()
subsequences = list(rows[0].keys())[1:] # creates a list of keys
results = {}
for subsequence in subsequences:
results[subsequence] = longest_match(dna_sequence, subsequence)
for row in rows:
match = True
for subsequence in subsequences:
if int(row[subsequence]) != results[subsequence]:
match = False
print("No match")
break
if match:
print(row["Name"])
break
def longest_match(sequence, subsequence):
longest_run = 0
subsequence_length = len(subsequence)
sequence_length = len(sequence)
for i in range(sequence_length):
count = 0
while True:
start = i + count * subsequence_length
end = start + subsequence_length
if sequence[start:end] == subsequence:
count += 1
else:
break
longest_run = max(longest_run, count)
return longest_run
main()
Подробнее здесь: https://stackoverflow.com/questions/798 ... a-cs50-ps6
Мобильная версия