tl; dr: реализация программы, которая идентифицирует человека на основе его ДНК на Python.

Должен сказать, что я очень ценю реальный контекст вопросов и наборов CS50. Последняя часть Python влечет за собой написание программы, которая будет брать последовательности ДНК (в перестановке A, G, T и C), чтобы найти, какие шаблоны повторяются наиболее последовательно, и сопоставить их с человеком, которому, вероятно, принадлежит ДНК.

Приведенные спецификации являются довольно исчерпывающими и подробно описывают поставленную задачу. Во-первых, программа должна запросить ввод соответствующих текстовых файлов (а именно, dna.py, data.csv и sequence.txt). После открытия файлов и считывания содержимого в свою память программа должна вычислить самый длинный цикл последовательных повторов паттернов ДНК и распечатать имя человека с соответствующим паттерном. Псевдокод такой:

  1. Проверить, действителен ли ввод (т.е. есть ли 3 аргумента); в противном случае распечатайте сообщение об ошибке.
  2. Прочтите последовательность ДНК из файла
  3. Сохраните информацию в строке
  4. Создайте словарь для хранения последовательностей ДНК, которые необходимо подсчитать.
  5. Извлечь последовательности из базы данных в список
  6. Скопируйте список в словарь, где гены являются ключами
  7. Перебрать последовательность ДНК
  8. Добавить счетчик - если обнаружены повторы значений из словарей последовательностей, сложите их
  9. Откройте файл базы данных (людей)
  10. Перебрать и сравнить со словарем последовательностей
  11. Если есть совпадение, выведите имя человека; в противном случае нет совпадения.

Меня немного напугало, насколько сложно это выглядело, но, разобравшись, оно легко усваивается!

Сначала проверьте длину ввода. Если введено менее 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.