У меня есть строка 8bp testStr
ACTGACTG
Я хочу сравнить его с зеленым списком строк 8bp greenList
.
GGCGCATG
ACTGAAAT
ATGCCCGT
ACTGAGTG
Если 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», цикл продолжится.
Но должен быть лучший способ сделать это... Я также знаю, что существует множество алгоритмов выравнивания, доступных для выравнивания ДНК. Однако большинство из того, что я нашел, кажется излишним для этой простой ситуации. Любое руководство высоко ценится.
Ни один зеленый список не содержит заданного количества комбинаций (например, 3). Я хочу знать, находится ли testStr на расстоянии 1 любой из трех строк в greenList.
Но вы хотите рассчитать расстояние для любой вариации заданной строки в greenList
, верно? Или это просто между «ACTGACTG» и тремя последовательностями в greenList
. Я не понимаю, почему вы попытались «создать зеленый список, содержащий все возможные варианты расстояния Хэмминга 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 за поправку!
так что
greenList
содержит все возможные комбинации 8-символьных строк?