Найти количество разрывов в последовательности

У меня есть программа, которая анализирует последовательности аллелей. Я пытаюсь написать код, который определяет, завершен ли аллель или нет. Для этого мне нужно подсчитать количество разрывов в контрольной последовательности. Разрыв обозначается строкой '-'. Если есть более одного разрыва, я хочу, чтобы программа говорила "Неполная аллеля".

Как я могу выяснить, как подсчитать количество разрывов в последовательности?

Вот пример "разбитой" последовательности:

>DQB1*04:02:01
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
--ATGTCTTGGAAGAAGGCTTTGCGGAT-------CCCTGGAGGCCTTCGGGTAGCAACT
GTGACCTT----GATGCTGGCGATGCTGAGCACCCCGGTGGCTGAGGGCAGAGACTCTCC
CGAGGATTTCGTGTTCCAGTTTAAGGGCATGTGCTACTTCACCAACGGGACCGAGCGCGT
GCGGGGTGTGACCAGATACATCTATAACCGAGAGGAGTACGCGCGCTTCGACAGCGACGT
GGGGGTGTATCGGGCGGTGACGCCGCTGGGGCGGCTTGACGCCGAGTACTGGAATAGCCA
GAAGGACATCCTGGAGGAGGACCGGGCGTCGGTGGACACCGTATGCAGACACAACTACCA
GTTGGAGCTCCGCACGACCTTGCAGCGGCGA-----------------------------
-----------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
---GTGGAGCCCACAGTGACCATCTCCCCATCCAGGACAGAGGCCCTCAACCACCACAAC
CTGCTGGTCTGCTCAGTGACAGATTTCTATCCAGCCCAGATCAAAGTCCGGTGGTTTCGG
AATGACCAGGAGGAGACAACTGGCGTTGTGTCCACCCCCCTTATTAGGAACGGTGACTGG
ACCTTCCAGATCCTGGTGATGCTGGAAATGACTCCCCAGCGTGGAGACGTCTACACCTGC
CACGTGGAGCACCCCAGCCTCCAGAACCCCATCATCGTGGAGTGGCGGGCTCAGTCTGAA
TCTGCCCAGAGCAAGATGCTGAGTGG----CATTGGAGGCTTCGTGCTGGGGCTGATCTT
CCTCGGGCTGGGCCTTATTATC--------------CATCACAGGAGTCAGAAAGGGCTC
CTGCACTGA---------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------

Код, который у меня есть до сих пор, выглядит следующим образом:

idx=[]
for m in range(len(sequence)):
 for n in re.finditer('-',sequence[0]): 
 idx.append(n.start())
counter=0
min_val=[]
for n in range(len(idx)):
 if counter==idx[n]:
 counter=counter+1
 elif counter !=0:
 min_val.append(idx[n-1])
 counter=0

Мое рассуждение для вышеуказанного кода заключалось в том, что если бы я мог найти начальные позиции "-", то я могу видеть, сколько раз они появляются в последовательности и если они вообще нарушают последовательность. Тем не менее, я знаю, что в приведенном выше коде есть некоторые недостатки.

3 ответа

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

>>> sequence = """>DQB1*04:02:01....."""
>>> joined = ''.join(sequence.splitlines())
>>> sum(1 for m in re.finditer("-+", joined))
7

Примечание. Это включает в себя - в начале и конце последовательности.

Или отмените подход: вместо подсчета пробелов считайте группы:

>>> sum(1 for m in re.finditer("[GATC]+", joined))
6


Вы можете просто отфильтровать все символы "-" и на основании количества оставшихся сегментов определить количество разрывов.

str_list = filter(None, sequence.split('-'))
if len(str_list) > 2:
 return "Incomplete Allele"
else:
 return "Complete Allele"


Я думаю, что это должно сделать:

def test(sequence):
 sequence = ''.join(sequence.splitlines()[1:]) # remove first line (header and line breaks)
 S = [segments for segments in sequence.split('-') if block != '']
 if len(S)>2: # len(S) should be the number of remaining segments
 print "Incomplete Allele."

licensed under cc by-sa 3.0 with attribution.