tl; dr: реализация программы, которая идентифицирует человека на основе его ДНК на Python.
Должен сказать, что я очень ценю реальный контекст вопросов и наборов CS50. Последняя часть Python влечет за собой написание программы, которая будет брать последовательности ДНК (в перестановке A, G, T и C), чтобы найти, какие шаблоны повторяются наиболее последовательно, и сопоставить их с человеком, которому, вероятно, принадлежит ДНК.
Приведенные спецификации являются довольно исчерпывающими и подробно описывают поставленную задачу. Во-первых, программа должна запросить ввод соответствующих текстовых файлов (а именно, dna.py, data.csv и sequence.txt). После открытия файлов и считывания содержимого в свою память программа должна вычислить самый длинный цикл последовательных повторов паттернов ДНК и распечатать имя человека с соответствующим паттерном. Псевдокод такой:
- Проверить, действителен ли ввод (т.е. есть ли 3 аргумента); в противном случае распечатайте сообщение об ошибке.
- Прочтите последовательность ДНК из файла
- Сохраните информацию в строке
- Создайте словарь для хранения последовательностей ДНК, которые необходимо подсчитать.
- Извлечь последовательности из базы данных в список
- Скопируйте список в словарь, где гены являются ключами
- Перебрать последовательность ДНК
- Добавить счетчик - если обнаружены повторы значений из словарей последовательностей, сложите их
- Откройте файл базы данных (людей)
- Перебрать и сравнить со словарем последовательностей
- Если есть совпадение, выведите имя человека; в противном случае нет совпадения.
Меня немного напугало, насколько сложно это выглядело, но, разобравшись, оно легко усваивается!
Сначала проверьте длину ввода. Если введено менее 3 аргументов, отобразить сообщение об ошибке.
#check length if len(argv) < 3: print("Usage: python dna.py data.csv sequence.txt") exit()
Затем прочтите первый файл - последовательность ДНК. Сохраните это как строки и создайте словарь для следующей части.
# read the dna sequence from the file with open(argv[2]) as DNAfile: DNAreader = reader(DNAfile) for row in DNAreader: DNAlist = row #store in string DNA = DNAlist[0] #create a dictionary sequences = {}
В-пятых, извлеките последовательности из базы данных ДНК в список.
with open(argv[1]) as peoplefile: people = reader(peoplefile) for row in people: DNASequences = row DNASequences.pop(0) break
Затем скопируйте этот список в словарь - суть в том, что теперь каждый ген сам по себе является ключом. Это позволяет выполнять итерацию и сравнение по одному.
for item in DNASequences: sequences[item] = 1
Просмотрите последовательность ДНК.
# if repetitions of the values from sequence dictionary are found, count for key in sequences: l = len(key) tempMax = 0 temp = 0 for i in range(len(DNA)): # after having counted a sequence # skip at the end of it to avoid counting again while temp > 0: temp -= 1 continue # if the segment of dna corresponds to the key && #there is a repetition of it #increment counter if DNA[i: i + l] == key: while DNA[i - l: i] == DNA[i: i + l]: temp += 1 i += l # compare the value to the previous longest sequence && # if it is longer it becomes the new max if temp > tempMax: tempMax = temp # store the longest sequences in the dictionary using the correspondent key sequences[key] += tempMax
Для сравнения необходимо открыть и просмотреть другой файл, известный как база данных людей. Точно так же это должно быть в словарной форме для сравнения.
with open(argv[1], newline='') as peoplefile: people = DictReader(peoplefile) for person in people: match = 0 # compares the sequences to every person and prints name # leave the program if there is a match for DNA in sequences: if sequences[DNA] == int(person[DNA]): match += 1 if match == len(sequences): print(person['name']) exit() #otherwise, no match print("No match")
Заключительная часть - это просто написание соответствующего имени. По общему признанию, это заняло у меня время, но опять же, намного лучше, чем у C.