Быстрое сравнение коротких строк ДНК Python

У меня есть строка 8bp testStr

ACTGACTG

Я хочу сравнить его с зеленым списком строк 8bp greenList.

GGCGCATGACTGAAATATGCCCGTACTGAGTG

Если testStr находится в пределах расстояния Хэмминга 1 (имеет разницу в <= 1 позиции) любой строки в greenList, я хочу, чтобы цикл for продолжался. Ниже приведено приемлемое совпадение, поскольку последовательности различаются только в одной позиции.

ACTGACTG

||||| ||

ACTGAGTG

Моя первая попытка сделать это была сосредоточена на создании зеленого списка, содержащего все возможные варианты расстояния Хэмминга 1 для строк в зеленом списке... Например, последовательность GGCGCATG дает следующие варианты расстояния Хэмминга 1.

АГГККАТГ CGCGCATG TGCGCATG GACGCATG GCCGCATG GTCGCATG GGAGCATG ГГТГКАТГ ГГГГКАТГ GGCACATG GGCCCATG GGCTCATG GGCGAATG ГГКГТАТГ ГГКГГАТГ ГГГКЦТГ ГГГКЦТГ ГГГКГТГ ГГГКЦАГ GGCGCCCG GGCGCCGG ГГГКЦТА GGCCGCCTC GGCCGCCTT

Если какая-либо из приведенных выше последовательностей напрямую соответствует «testStr», цикл продолжится.

Но должен быть лучший способ сделать это... Я также знаю, что существует множество алгоритмов выравнивания, доступных для выравнивания ДНК. Однако большинство из того, что я нашел, кажется излишним для этой простой ситуации. Любое руководство высоко ценится.

так что greenList содержит все возможные комбинации 8-символьных строк?

Ivan 11.12.2020 22:27

Ни один зеленый список не содержит заданного количества комбинаций (например, 3). Я хочу знать, находится ли testStr на расстоянии 1 любой из трех строк в greenList.

Paul 11.12.2020 22:28

Но вы хотите рассчитать расстояние для любой вариации заданной строки в greenList, верно? Или это просто между «ACTGACTG» и тремя последовательностями в greenList. Я не понимаю, почему вы попытались «создать зеленый список, содержащий все возможные варианты расстояния Хэмминга 1 для строк в зеленом списке ...»

Ivan 11.12.2020 22:38

Да, с тем ограничением, что нас интересуют только варианты с разницей <= 1. позвольте мне попытаться прояснить вопрос немного больше....

Paul 11.12.2020 22:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
297
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам не нужно создавать все варианты вашего списка green. Вместо этого вы можете рассчитать фактическое расстояние Хэмминга между вашей входной последовательностью x и каждой последовательностью в green.

Я собирался предоставить решение, которое кодирует последовательности строк в списки целых чисел, но оно будет отлично работать со строками как есть, поскольку строки являются итерируемыми!

Поэтому нам нужно только реализовать функцию расстояния Хэмминга, которая будет подсчитывать количество непохожих символов между двумя заданными строками. Это будет делать:

def hamming(s1, s2):
    return sum(c1 != c2 for c1, c2 in zip(s1, s2))

Затем мы можем перебрать green и сохранить только элементы с расстоянием до x<= 1:

x = 'ACTGACTG'
green = ['GGCGCATG', 'ACTGAAAT', 'ATGCCCGT', 'ACTGAGTG']

res = [s for s in green if hamming(s, x) <= 1]

Спасибо @Daniel за поправку!

Другие вопросы по теме