2015-04-25 6 views
7

W jaki sposób mogę kodować łączony ciąg znaków w formacie fasta, aby zgrupować wszystkie następujące po sobie nukleotydy i łączniki oraz encode them as run length.Zliczanie kolejnych alfabetów i łączników i zakodowywanie ich jako długości przebiegu

Rozważ moją sekwencję jako "ATGC ---- CGCTA ----- G ---". Łańcuch ma sekwencję Nucleotide, po której następuje sekwencja łączników. Próbuję zgrupować wszystkie następujące po sobie nukleotydy jako literę M i kolejne myślniki jako literę D i poprzedzić ją rozmiarem podsekwencji.

Końcowy wynik poza tym kodowaniem powinien wynosić 4M4D5M5D1M3D.

Poniższy obrazowym graficzny wyjaśnia ponadto

ATGC----CGCTA-----G--- 
| | | | | | 
V V V V V V 
4M 4D 5M 5D 1M 3D 

Gdy używam Counter lub list.count(), mam "M":10 "D":12:

from collections import Counter 

seq="ATGC----CGCTA-----G---" 

M=0 
D=0 

cigar=[] 

for char in seq:  
    if char.isalpha(): 
     M+=1 
     cigar.append("M") 
    else: 
     D+=1 
     cigar.append("D") 

print Counter(cigar) 
+0

jakie jest twoje pytanie? –

+0

Pytanie brzmi: staram się osiągnąć coś w stylu 4M4D5M5D1M3D – gthm

Odpowiedz

11

Problem ten jest idealny dla itertools.groupby

Realizacji

from itertools import groupby 
''.join('{}{}'.format(len(list(g)), 'DM'[k]) 
     for k, g in groupby(seq, key = str.isalpha)) 

Output '4M4D5M5D1M3D'

Wyjaśnienie

Warto zauważyć, że przycisk funkcyjny ma tu kluczowe znaczenie. Pogrupuj sekwencję w oparciu o alfabet lub nie. Gdy to zrobisz, powinno być proste do zliczenia wielkości każdej grupy i ustalenia typu grupy z kluczowego elementu.

Niektóre wyjaśnienie kodu

  • 'DM'[k]: To jest po prostu ładne sposobem reprezentowania "M" if k == True else "D"
  • len(list(g)): Określa rozmiar każdej grupy. Alternatywnie, może to być napisane jak sum(1 for e in g)
  • '{}{}'.format: String formatowania stworzyć konkatenacji z rzędu częstotliwość i rodzaj
  • ''.join(: przyłączyć się do elementów listy jako sekwencji strun.
+3

piękne rozwiązanie .... lepsze niż moje rozwiązanie :-) .... dzięki –

+0

@JoseRicardoBustosM .: Gdzie jest twoje rozwiązanie lub czegoś brakuje? – Abhijit

+0

kiedy zobaczyłem twoje rozwiązanie, nie wysyłaj go;) ..... Zacząłem studiować twój post –

3

klasyczne podejście:

seq="ATGC----CGCTA-----G---" 

def MD(c): 
    if c.isalpha():return "M" 
    else : return "D" 

count=1 
string="" 
for i in range(len(seq)-1): 
    if MD(seq[i])==MD(seq[i+1]): count+=1 
    else: 
     string=string+str(count)+MD(seq[i]) 
     count=1 
string=string+str(count)+MD(seq[-1]) 
print string 
4
import re 
seq='ATGC----CGCTA-----G---' 

output = '' 
for section in re.split('(-*)', seq): 
    if section.isalpha(): 
     output += str(len(section)) + 'M' 
    elif section !='': 
     output += str(len(section)) + 'D' 
print output 
Powiązane problemy