Шаг 17.
Задачи ComputerScience на Python.
Задачи поиска. Поиск ДНК

    На этом шаге мы рассмотрим общие принципы прдставления и поиска ДНК.

    В компьютерных программах гены обычно представляются в виде последовательности символов А, С, G и Т, где каждая буква означает нуклеотид, а комбинация трех нуклеотидов называется кодоном.


Рис.1. Нуклеотид представлен буквой А, С, G или Т. Кодон состоит из трех нуклеотидов, а ген - из нескольких кодонов

    Кодон кодирует конкретную аминокислоту, которая вместе с другими аминокислотами может образовывать белок. Классическая задача в программах биоинформатики - найти в гене определенный кодон.

Хранение ДНК

    Мы можем представить нуклеотид в виде простого IntEnum с четырьмя вариантами значений.

from enum import IntEnum
from typing import Tuple, List

Nucleotide: IntEnum = IntEnum('Nucleotide', ('A', 'C', 'G', 'T'))

    Nucleotide относится к типу IntEnum, а не просто Enum, поскольку IntEnum "бесплатно" обеспечивает операторы сравнения (<, >= и т. п.). Наличие этих операторов в типе данных необходимо для алгоритмов поиска, которые мы собираемся реализовать, чтобы иметь возможность сравнивать значения. Импорт Tuple и List из пакета typing нужен для того, чтобы помочь с аннотациями типа.

    Кодоны могут быть определены как кортеж из трех нуклеотидов, а ген - как список кодонов.

Codon = Tuple[Nucleotide, Nucleotide, Nucleotide]
# псевдоним типа для кодонов
Gene = List[Codon]  # псевдоним типа для генов


Позже нам придется сравнивать объекты Codon друг с другом, но не нужно определять собственный класс с оператором <, явно реализованным для Codon. Это связано с тем, что в Python есть встроенная поддержка сравнения кортежей, состоящих из типов, которые также являются сравнимыми.

    Как правило, в Интернете гены представлены в формате файлов, которые содержат одну гигантскую строку, содержащую все нуклеотиды в той последовательности, в которой они располагаются в гене. Мы определим такую строку для предполагаемого гена и назовем ее gene_str.

gene_str: str = "ACGTGGCTCTCTAACGTACGTACGTACGGGGTTTATATATACCCTAGGACTCCCTTT"

    Нам также понадобится служебная функция для преобразования str в Gene.

def string_to_gene(s: str) -> Gene:
    gene: Gene = []
    for i in range(0, len(s), 3):
        if (i + 2) >= len(s):  # не выходить за пределы строки!
            return gene
        # инициализировать кодон из трех нуклеотидов
        codon: Codon = (Nucleotide[s[i]], Nucleotide[s[i + 1]],
                        Nucleotide[s[i + 2]])
        gene.append(codon)  # добавить кодон в ген
    return gene
Функция string_to_gene() постоянно проходит строку и преобразует каждые три символа в объекты Codon, которые добавляет в конец нового объекта Gene. Если эта функция обнаруживает отсутствие двух нуклеотидов после текущего места в исследуемой строке s (см. оператор if в цикле), значит, достигнут конец неполного гена, и эти последние один или два нуклеотида пропускаются.

    Функцию string_to_gene() можно использовать для преобразования gene_str в Gene.

my_gene: Gene = string_to_gene(gene_str)

    На следующем шаге мы продолжим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг